用Java

时间:2017-03-03 12:21:49

标签: java hdf5

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

enter image description here

文件大小为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 lib的byteToDouble()函数中。它有很多倍,但不应该花那么多时间吗?

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我认为问题在于您将数据读取到2D数组Double[][]中。执行此操作时,HDF5的实现速度非常慢(认为问题可能出在HDFArray.arrayify中)。尝试将数据读取到一维double[]中。

同样,您使用的是盒装Double,最好使用原始double