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

Resize HDF5 dataset in Julia

有没有办法使用 Julia 的 HDF5.jl 在 HDF5 中调整分块数据集的大小?我没有在文档中看到任何内容。查看源代码,我发现的只是 set_dims!(),但这不能扩展数据集(只能缩小它)。 HDF5.jl 是否能够扩大现有(分块)数据集?这对我来说是一个非常重要的功能,我宁愿不必调用另一种语言。

我相信我已经弄明白了。问题是我忘记给数据空间足够大 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_UNLIMITED 的类型是 Uint64,但是 dataspace 函数只接受 Int64 的元组,因此我使用 typemax(Int64) 的原因我的max_dims模仿H5S_UNLIMITED的推导方式。
  • 我使用的 d_create 形式错误地调用了 h5d_create;它通过 parent 而不是 checkvalid(parent).id(可以通过与其他形式的 d_create 的比较看出)。

文档在下面摘录的 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]