我有一个使用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 lib的byteToDouble()函数中。它有很多倍,但不应该花那么多时间吗?
感谢您的帮助!
答案 0 :(得分:0)
我认为问题在于您将数据读取到2D数组Double[][]
中。执行此操作时,HDF5的实现速度非常慢(认为问题可能出在HDFArray.arrayify
中)。尝试将数据读取到一维double[]
中。
同样,您使用的是盒装Double
,最好使用原始double
。