栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

用Python编写HDF5文件的最快方法?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

用Python编写HDF5文件的最快方法?

我将避免对数据进行分块,并将数据存储为一系列单数组数据集(以及本杰明所建议的内容)。我刚刚将一直在研究的企业应用程序的输出加载到HDF5中,并且能够将大约45亿个复合数据类型打包为450,000个数据集,每个数据集包含10,000个数据数组。现在,读写似乎是瞬时的,但是当我最初尝试对数据进行分块时,速度非常慢。

只是一个想法!

更新:

这些是从我的实际代码(我使用C与Python进行编码,但您应该了解我在做什么)中摘录的几段代码,并进行了修改以使其更加清晰。我只是在数组中写长的无符号整数(每个数组10,000个值),并在需要实际值时读回它们

这是我典型的编写者代码。在这种情况下,我只是将长的无符号整数序列写入数组序列中,并在创建它们时将每个数组序列加载到hdf5中。

//Our dummy data: a rolling count of long unsigned integerslong unsigned int k = 0UL;//We'll use this to store our dummy data, 10,000 at a timelong 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 arrayhsize_t dsDim[1] = {NUMPERDATASET};//Create the data space.hid_t dSpace = H5Screate_simple(1, dsDim, NULL);//NUMDATASETS = MAXSSVALUE / NUMPERDATASET, where MAXSSVALUE = 4,500,000,000for (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 spaceH5Sclose(dSpace);//Close the data files.H5Fclose(ssdb);

这是我的阅读器代码的略微修改版本。有很多更优雅的方法可以做到这一点(即,我可以使用超平面来获得价值),但是对于我训练有素的Agile /
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语言中,这非常简单,与分块数据集解决方案相比,它使我的读写时间明显缩短。另外,由于无论如何我都无法对化合物数据集使用压缩,因此分块的明显好处是有争议的,因此所有化合物都以相同的方式存储。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/645724.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号