1

首先,我阅读了主题“用 Python 编写 hdf5 文件的最快方法? ”,但它不是很有帮助。

我正在尝试在 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

谢谢

4

3 回答 3

1

您可以将所有数据加载到numpy arraywithloadtext并使用它来实例化您的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">
于 2014-06-26T19:20:27.737 回答
0

我最终使用了搁置库(Pickle 与在 Python中存储大型字典的搁置)将大型字典存储到文件中。我花了 2 天时间才将哈希写入文件,但一旦完成,我就能够非常快速地加载和访问任何元素。归根结底,我不必阅读我的大文件并将所有信息写入其中,也不必对哈希做任何我想做的事情。

问题解决了!

于 2014-07-01T00:41:31.783 回答
0

既然只有一个gb,为什么不先把它完全加载到内存中呢?请注意,您似乎也在使用 a 对 dset 进行索引str,这可能是问题所在。

我刚刚意识到我误读了最初的问题,对此感到抱歉。看起来您的代码正在尝试使用似乎是字符串的索引 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)
于 2014-06-26T19:12:53.477 回答