首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >用Python编写HDF5文件的最快方法?

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

Stack Overflow用户
提问于 2011-03-29 09:37:09
回答 3查看 32K关注 0票数 23

假设有一个大的(10 GB) CSV文件,其中包含混合的文本/数字,那么在保持合理的内存使用的同时,创建具有相同内容的HDF5文件的最快方法是什么?

如果可能的话,我想使用h5py模块。

在下面的玩具示例中,我发现了一种将数据写入HDF5的非常慢和非常快的方法。在10,000行左右的块中写入HDF5是不是最佳实践?或者,有没有更好的方法将大量数据写入这样的文件?

代码语言:javascript
复制
import h5py

n = 10000000
f = h5py.File('foo.h5','w')
dset = f.create_dataset('int',(n,),'i')

# this is terribly slow
for i in xrange(n):
  dset[i] = i

# instantaneous
dset[...] = 42
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-04-06 05:59:30

我会避免将数据分块,并将数据存储为一系列单数组数据集(沿着本杰明所建议的路线)。我刚刚完成了将一直在处理的企业应用程序的输出加载到HDF5中,并且能够将大约45亿个复合数据类型打包为450,000个数据集,每个数据集包含10,000个数据数组。写入和读取现在看起来相当即时,但当我最初尝试分块数据时,速度非常慢。

这只是一个想法!

更新:

这些是从我的实际代码(我用C编写而不是Python编写,但您应该明白我在做什么)中提取的几个代码片段,并且为了清晰起见对它们进行了修改。我只是在数组中写入长的无符号整数(每个数组有10,000个值),并在需要实际值时读回它们

这是我典型的编写代码。在本例中,我只是将长无符号整数序列写入数组序列,并在创建数组序列时将其加载到hdf5中。

代码语言:javascript
复制
//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开发过程来说,这是最干净的解决方案。

代码语言:javascript
复制
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];
}

主要的收获是编写代码中的内部循环以及整数除法和模运算,以获得数据集数组的索引和该数组中所需值的索引。让我知道这是否足够清楚,这样你就可以在h5py中放入类似或更好的东西。在C语言中,这非常简单,与分块数据集解决方案相比,它提供了更好的读/写时间。此外,由于我不能对复合数据集使用压缩,因此分块的明显优势是一个未知数,因此我所有的复合数据都以相同的方式存储。

票数 8
EN

Stack Overflow用户

发布于 2014-06-27 17:27:15

利用numpy.loadtxt的灵活性,可以将文件中的数据放入numpy array中,而后者又非常适合初始化hdf5数据集。

代码语言:javascript
复制
import h5py
import numpy as np

d = np.loadtxt('data.txt')
h = h5py.File('data.hdf5', 'w')
dset = h.create_dataset('data', data=d)
票数 5
EN

Stack Overflow用户

发布于 2011-03-29 10:03:12

我不确定这是否是最有效的方法(我从未使用过它;我只是将一些我独立使用过的工具组合在一起),但您可以使用matplotlib helper methods for csv将csv文件读入一个numpy recarray中。

您可能还可以找到一种方法,以块的形式读取csv文件,以避免将整个文件加载到磁盘。然后使用recarray (或其中的片段)将整个(或其中的大部分)写入h5py数据集。我不太确定h5py是如何处理recarray的,但是文档表明它应该没问题。

基本上,如果可能的话,试着一次写大块数据,而不是迭代单个元素。

另一种读取csv文件的方法是numpy.genfromtxt

您可以使用关键字usecols获取所需的列,然后通过正确设置skip_headerskip_footer关键字,只读入一组指定的行。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5466971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档