【问题标题】:H5 file reading very slow with Java使用Java读取H5文件非常慢
【发布时间】:2017-07-23 13:23:42
【问题描述】:

我有一个使用 H5 库的 Java 程序,它尝试读取具有以下属性的 H5 文件中的数据集:

文件大小为 769M。

读取数据集的代码如下(很简单):

// Open file using the default properties.
fileId = H5.H5Fopen(filepath, HDF5Constants.H5F_ACC_RDONLY, HDF5Constants.H5P_DEFAULT);
// Open dataset using the default properties.
if (fileId >= 0) {
   datasetId = H5.H5Dopen(fileId, "/data/0_u0/20050103", HDF5Constants.H5P_DEFAULT);
}

if (datasetId >= 0) {
   dataSpaceId = H5.H5Dget_space(datasetId);
}

// Get the dimensions of the dataset
int ndims = -1;
if (dataSpaceId >= 0)
   ndims = H5.H5Sget_simple_extent_ndims(dataSpaceId);

if (ndims > 0) {
    long[] dims = new long[ndims];
    H5.H5Sget_simple_extent_dims(dataSpaceId, dims, null);
    H5.H5Sclose(dataSpaceId);

    int dimX = (int)dims[0];
    int dimY = (int)dims[1];

    Double[][] dsetData = new Double[dimX][dimY];
    H5.H5Dread(datasetId, HDF5Constants.H5T_NATIVE_DOUBLE,
               HDF5Constants.H5S_ALL, HDF5Constants.H5S_ALL,
               HDF5Constants.H5P_DEFAULT, dsetData);
}

这需要很长时间(超过 15 分钟,之后我就停下来了)。 我不明白的是,我在Python中也有类似的代码,而且需要几秒钟。

当我调试 Java 程序并在中间执行中停止时,它在 H5 库的 byteToDouble() 函数中。双倍多,但应该不会花那么多时间吧?

感谢您的帮助!

【问题讨论】:

  • 也许你是 GC 的受害者,你的 java 程序给了你多少内存,Double[][] 数组的大小是多少?
  • 数组大小为 506,000 * 357 = 180,642,000。我使用默认内存设置。但是当我查看 htop 时,它并没有使用 100% 的内存...
  • @blondie,嗨,我也有同样的问题。你找到解决问题的方法了吗?如果是这样,请回答您的问题。谢谢。
  • 嗨@user153245。不,我还没有找到解决方案。最终没有使用 H5……关于如何使用 H5 文件的文档也很少。

标签: java hdf5


【解决方案1】:

我认为问题在于您将数据读入二维数组Double[][]。当你这样做时,HDF5 的实现非常慢(认为问题可能在HDFArray.arrayify 中)。尝试将数据读入一维double[]

此外,您使用的是盒装Double,使用原始double 可能会更好。

【讨论】:

    猜你喜欢
    • 2021-10-12
    • 1970-01-01
    • 2019-04-30
    • 1970-01-01
    • 1970-01-01
    • 2018-10-27
    • 2012-06-05
    • 1970-01-01
    • 2015-08-19
    相关资源
    最近更新 更多