【问题标题】:Resize HDF5 dataset in Julia在 Julia 中调整 HDF5 数据集的大小
【发布时间】:2015-09-01 18:11:04
【问题描述】:

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

【问题讨论】:

  • 我看到我的问题被否决了。我怀疑这意味着我违反了某些社区准则,但如果我知道那我可能就不会违反该准则。如果有人让我知道我的问题有什么问题,我很乐意将其修改为更合适。
  • 这是一个很好的例子,说明为什么反对者应该总是至少考虑添加一条解释反对票的评论(或支持现有的解释评论)。这个问题对我来说看起来很明智,我会支持你回到零。我最好的猜测是反对者的理由是“你试过什么”的变体?但是,您已阅读文档并引用 set_dims!() 的事实足以让我满意,您已尝试在发布之前回答您自己的问题。
  • 另外,为了回答这个问题:你知道 HDF5 库中的哪个函数可以满足你的需要吗? @tholy 将该库中的大多数常用函数包装在 HDF5.jl 包中,但并非所有函数都被导出(或记录),即您需要使用 HDF5.FunctionName 来调用它们。如果你想要的功能没有被包装,那么你可以尝试提交一个拉取请求,尽管准备好响应可能是“目前没有空闲时间,请尝试自己实现包装器”。
  • 出于各种原因,我正在努力使 C++ 代码适应 Julia。执行此操作的 C++ 方法是 Dataset::extend。
  • 有一个H5Dset_extent 函数。正如@colin 所建议的那样,试试HDF5.h5d_set_extent()?

标签: julia hdf5


【解决方案1】:

我相信我已经弄明白了。问题是我忘了给数据空间一个足够大的 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) 作为我的max_dims 来模仿H5S_UNLIMITED 的派生方式.
  • 我使用的d_create的形式错误地调用h5d_create;它通过parent 而不是checkvalid(parent).id(通过与d_create 的其他形式比较可以看出)。

【讨论】:

    【解决方案2】:

    文档在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] 
    

    【讨论】:

      猜你喜欢
      • 2021-09-24
      • 1970-01-01
      • 1970-01-01
      • 2014-05-24
      • 2016-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多