【发布时间】: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 文件的文档也很少。