You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用HDF.PInvoke在.NET中创建可扩展HDF5 3D数据集遇错求助

问题原因及解决方案

创建可扩展(包含无限维度)的HDF5数据集失败,核心原因是未指定分块存储布局。HDF5规定,包含无限维度的数据集不能使用默认的连续存储,必须显式配置分块(Chunked)存储模式。

修改步骤

  • 创建数据集创建属性列表(Dataset Creation Property List)
  • 为属性列表设置分块大小(建议和初始切片维度一致,即width*width*1)
  • 在H5D.create调用中传入该属性列表,替代原有的0值
  • 操作完成后关闭属性列表,避免资源泄漏

修改后的完整代码

using HDF.PInvoke;
using hid_t = System.Int64;
using hsize_t = System.UInt64;

public static void Create3DDataSet(hid_t gpID, string name, ushort[] im )
{            
    const int width = 2048;
     
    System.Diagnostics.Trace.Assert(im.Length == width * width);
    const int rank = 3;
    hsize_t[] current_dims = new hsize_t[rank] { width, width, 1 };
    hsize_t[] max_Dims = new hsize_t[rank] { width, width, H5S.UNLIMITED };

    hid_t dataSpace = HDFErrChk(H5S.create(H5S.class_t.SIMPLE));//1S
    HDFErrChk(H5S.set_extent_simple(dataSpace, rank, current_dims, max_Dims));
    hid_t typeId = HDFErrChk(H5T.copy(H5T.NATIVE_USHORT));//2T

    // --- 新增分块存储配置 ---
    hsize_t[] chunkDims = new hsize_t[rank] { width, width, 1 };
    hid_t createPlist = HDFErrChk(H5P.create(H5P.DATASET_CREATE));
    HDFErrChk(H5P.set_chunk(createPlist, rank, chunkDims));
    // -----------------------

    // 使用创建属性列表替代原有的0值
    hid_t datasetId = HDFErrChk(H5D.create(gpID, name, typeId, dataSpace, H5P.DEFAULT, createPlist, H5P.DEFAULT));//3D

    GCHandle pinnedArray = GCHandle.Alloc(im, GCHandleType.Pinned);
    HDFErrChk(H5D.write(datasetId, typeId, H5S.ALL, H5S.ALL, H5P.DEFAULT, pinnedArray.AddrOfPinnedObject()));
    pinnedArray.Free();

    // --- 关闭新增的属性列表 ---
    HDFErrChk(H5P.close(createPlist));
    // -----------------------

    HDFErrChk(H5S.close(dataSpace));//1S
    HDFErrChk(H5T.close(typeId));//2T
    HDFErrChk(H5D.close(datasetId));//3D
}
    
public static long HDFErrChk(long err)
{
    if (err < 0)
    {
       throw new HDF5Exception("Negative return value from HDF");
    }
    return err;
}

补充说明

  • 分块大小可以根据后续扩展需求调整,但建议保持和单张2D切片的维度一致,这样后续追加切片时操作更高效。
  • 如果需要启用压缩(比如GZIP),可以在创建属性列表后额外调用H5P.set_deflate(createPlist, compressionLevel),进一步减小文件体积。

内容的提问来源于stack exchange,提问作者drG_Bristol

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 18:03:34