使用h5py编写文件的最快方法

时间:2014-06-26 18:20:56

标签: python h5py

首先,我阅读了主题“Fastest way to write hdf5 file with Python?”,但它没有用处。

我正在尝试在h5f5结构中加载大约1GB(大小矩阵(70133351,1))的文件。

非常简单的代码,但速度很慢。

import h5py
f = h5py.File("8.hdf5", "w")
dset = f.create_dataset("8", (70133351,1))

myfile=open("8.txt")

for line in myfile:
   line=line.split("\t")
   dset[line[1]]=line[0]

myfile.close()
f.close()

我有一个50MB的矩阵的较小版本,我尝试了相同的代码,并且在24小时后没有完成。

我知道让它更快的方法是避免“for循环”。如果我使用常规python,我会使用哈希理解。但是,看起来它不适合这里。

我可以稍后通过以下方式查询该文件:

f = h5py.File("8.hdf5")
h=f['8']
print 'GFXVG' in h.attrs 

哪个会回答我“真实”,因为GFXVG是关键的h

有人有任何想法吗?

部分文件示例:

508 LREGASKW
592 SVFKINKS
1151        LGHWTVSP
131 EAGQIISE
198 ELDDSARE
344 SQAVAVAN
336 ELDDSARF
592 SVFKINKL
638 SVFKINKI
107 PRTGAGQH
107 PRTGAAAA

由于

3 个答案:

答案 0 :(得分:1)

您可以使用numpy array将所有数据加载到loadtext,并使用它来实例化hdf5数据集。

import h5py
import numpy as np

d = np.loadtxt('data.txt', dtype='|S18')

返回

array([['508.fna', 'LREGASKW'],
   ['592.fna', 'SVFKINKS'],
   ['1151.fna', 'LGHWTVSP'],
   ['131.fna', 'EAGQIISE'],
   ['198.fna', 'ELDDSARE'],
   ['344.fna', 'SQAVAVAN'],
   ['336.fna', 'ELDDSARF'],
   ['592.fna', 'SVFKINKL'],
   ['638.fna', 'SVFKINKI'],
   ['107.fna', 'PRTGAGQH'],
   ['1197.fna', 'ELDDSARR'],
   ['1309.fna', 'SQTIYVWF'],
   ['974.fna', 'PNNLRFIA'],
   ['230.fna', 'IGKVYHIE'],
   ['76.fna', 'PGVHSVWV'],
   ['928.fna', 'HERGGAND'],
   ['520.fna', 'VLKTDTTG'],
   ['1290.fna', 'EAALDLHR'],
   ['25.fna', 'FCSILGVV'],
   ['284.fna', 'YHKLTFED'],
   ['1110.fna', 'KITSSSDF']], 
  dtype='|S18')

然后

h = h5py.File('data.hdf5', 'w')
dset = h.create_dataset('data', data=d)

给出:

<HDF5 dataset "init": shape (21, 2), type "|S18">

答案 1 :(得分:0)

由于它只有一个gb,为什么不首先将它完全加载到内存中?请注意,您似乎也使用str索引到dset,这很可能是个问题。

我刚才意识到我误解了最初的问题,抱歉。看起来你的代码试图使用索引1,它似乎是一个字符串,作为索引?也许有一个错字?

import h5py
from numpy import zeros

data = zeros((70133351,1), dtype='|S8') # assuming your strings are all 8 characters, use object if vlen

with open('8.txt') as myfile: 
   for line in myfile:
       idx, item = line.strip().split("\t")
       data[int(line[0])] = line[1]

with h5py.File('8.hdf5', 'w') as f:
    dset = f.create_dataset("8", (70133351, 1), data=data)

答案 2 :(得分:0)

我最终使用库搁置(Pickle versus shelve storing large dictionaries in Python)将大字典存储到文件中。我只花了2天时间将哈希写入文件,但一旦完成,我就能够非常快速地加载和访问任何元素。在一天结束的时候,我不必阅读我的大文件并在has中写下所有信息,并做任何我想用哈希做的事情。

问题解决了!