c语言读hdf5文件示例程序,用Python编写HDF5文件的最快方法?

我将避免将数据分块,并将数据存储为一系列单数组数据集(按照Benjamin的建议)。我刚刚完成了将一个企业应用程序的输出加载到HDF5中,并且能够将大约45亿个复合数据类型打包为45万个数据集,每个数据集包含10000个数据数组。写和读现在看起来相当即时,但当我最初试图将数据分块时却非常缓慢。

只是一个想法!

更新:

这是从我的实际代码中提取出来的几个片段(我用C和Python编写代码,但您应该了解我在做什么),并为了清晰起见进行了修改。我只是在数组中写入长的无符号整数(每个数组10000个值)并在需要实际值时将其读回

这是我典型的编写代码。在本例中,我只是将长无符号整数序列写入数组序列,并在创建时将每个数组序列加载到hdf5中。//Our dummy data: a rolling count of long unsigned integers

long unsigned int k = 0UL;

//We'll use this to store our dummy data, 10,000 at a time

long unsigned int kValues[NUMPERDATASET];

//Create the SS adata files.

hid_t ssdb = H5Fcreate(SSHDF, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);

//NUMPERDATASET = 10,000, so we get a 1 x 10,000 array

hsize_t dsDim[1] = {NUMPERDATASET};

//Create the data space.

hid_t dSpace = H5Screate_simple(1, dsDim, NULL);

//NUMDATASETS = MAXSSVALUE / NUMPERDATASET, where MAXSSVALUE = 4,500,000,000

for (unsigned long int i = 0UL; i < NUMDATASETS; i++){

for (unsigned long int j = 0UL; j < NUMPERDATASET; j++){

kValues[j] = k;

k += 1UL;

}

//Create the data set.

dssSet = H5Dcreate2(ssdb, g_strdup_printf("%lu", i), H5T_NATIVE_ULONG, dSpace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);

//Write data to the data set.

H5Dwrite(dssSet, H5T_NATIVE_ULONG, H5S_ALL, H5S_ALL, H5P_DEFAULT, kValues);

//Close the data set.

H5Dclose(dssSet);

}

//Release the data space

H5Sclose(dSpace);

//Close the data files.

H5Fclose(ssdb);

这是我的读者代码的一个稍微修改过的版本。有更优雅的方法可以做到这一点(例如,我可以使用超平面来获取价值),但对于我相当严格的敏捷/BDD开发过程来说,这是最干净的解决方案。unsigned long int getValueByIndex(unsigned long int nnValue){

//NUMPERDATASET = 10,000

unsigned long int ssValue[NUMPERDATASET];

//MAXSSVALUE = 4,500,000,000; i takes the smaller value of MAXSSVALUE or nnValue

//to avoid index out of range error

unsigned long int i = MIN(MAXSSVALUE-1,nnValue);

//Open the data file in read-write mode.

hid_t db = H5Fopen(_indexFilePath, H5F_ACC_RDONLY, H5P_DEFAULT);

//Create the data set. In this case, each dataset consists of a array of 10,000

//unsigned long int and is named according to its integer division value of i divided

//by the number per data set.

hid_t dSet = H5Dopen(db, g_strdup_printf("%lu", i / NUMPERDATASET), H5P_DEFAULT);

//Read the data set array.

H5Dread(dSet, H5T_NATIVE_ULONG, H5S_ALL, H5S_ALL, H5P_DEFAULT, ssValue);

//Close the data set.

H5Dclose(dSet);

//Close the data file.

H5Fclose(db);

//Return the indexed value by using the modulus of i divided by the number per dataset

return ssValue[i % NUMPERDATASET];

}

主要的收获是编写代码时的内部循环以及整数除法和mod操作,以获得数据集数组的索引和该数组中所需值的索引。让我知道,如果这是足够清楚的,所以你可以把类似或更好的东西在h5py。在C语言中,这非常简单,与分块数据集解决方案相比,它给了我更好的读/写时间。另外,由于无论如何我都不能对复合数据集使用压缩,块处理的明显好处是没有意义的,所以我的所有复合数据都以相同的方式存储。

你可能感兴趣的:(c语言读hdf5文件示例程序)