在Julia中调整HDF5数据集的大小

5
有没有办法使用Julia的HDF5.jl来调整chunked数据集的大小?我在文档中没有找到相关内容。查看源代码,我只发现了set_dims!(),但它不能扩展数据集(只能缩小它)。HDF5.jl是否具有扩展现有(chunked)数据集的能力?这对我来说是非常重要的功能,我不想调用其他语言来实现。

我看到我的问题被踩了。我怀疑这意味着我违反了某些社区准则,但如果我知道是什么,那么我可能就不会违反那个准则了。如果有人能告诉我我的问题有什么问题,我很乐意修改它以使其更合适。 - Brendan
这是一个很好的例子,说明为什么投票降低者应该始终考虑添加解释下降票的评论(或者点赞现有的解释评论)。我觉得问题很合理,我会给你点个赞让你回到零分。我最好的猜测是投票降低者的理由是“你尝试了什么”变体。但是,事实上,你已经阅读了文档并引用了set_dims!(),足以让我满意你在发布问题之前已经尝试回答自己的问题。 - Colin T Bowers
另外,针对这个问题:"你知道 HDF5 库中的哪个函数能完成你需要的功能吗?" @tholy 将该库中大部分常用的函数都打包在 HDF5.jl 中,但并非所有函数都被导出(或文档化),也就是说你需要使用 HDF5.FunctionName 来调用它们。如果你想要的函数没有被打包,那么你可以尝试提交一个 pull request,不过请准备好可能会得到 "目前没有空闲时间,请自己实现" 的回应。 - Colin T Bowers
出于各种原因,我正在努力将C++代码适配到Julia。实现这一目标的C++方法是Dataset::extend。 - Brendan
1
有一个H5Dset_extent函数。正如@colin所建议的,尝试使用HDF5.h5d_set_extent()如何? - Timothy Brown
2个回答

3
文档中在hdf5.md简要提到了可扩展维度,如下所示。
您可以使用可扩展维度,
d = d_create(parent, name, dtype, (dims, max_dims), "chunk", (chunk_dims), [lcpl, dcpl, dapl])
set_dims!(d, new_dims)

其中dims是整数元组。例如

b = d_create(fid, "b", Int, ((1000,),(-1,)), "chunk", (100,)) #-1 is equivalent to typemax(Hsize)
set_dims!(b, (10000,))
b[1:10000] = [1:10000] 

2

我相信我已经搞清楚了。问题在于我忘记给数据空间分配足够大的max_dims。这需要深入挖掘底层API。我找到的解决方案是:

dspace = HDF5.dataspace((6,20)::Dims, max_dims=(6,typemax(Int64)))
dtype = HDF5.datatype(Float64)
dset = HDF5.d_create(prt, "trajectory", dtype, dspace, "chunk", (6,10))

一旦我创建了一个可以适当调整大小的数据集,set_dims! 函数就会正确地调整数据集的大小。

我认为我找到了 API 中的一些小问题,我必须在本地版本中解决或更改这些问题。我将与 HDF5.jl 的所有者联系。对于那些感兴趣的人:

  • 常量 H5S_UNLIMITEDUint64 类型,但 dataspace 函数只接受 Int64 元组,因此我使用 typemax(Int64) 来模仿 H5S_UNLIMITED 的导出方式。
  • 我使用的 d_create 形式错误地调用了 h5d_create;它将 parent 传递给了 checkvalid(parent).id(通过与其他形式的 d_create 进行比较可以看到)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接