Python 用h5py编写文件的最快方法
首先,我读了主题“”,但它不是很有帮助 我试图加载一个h5f5结构中大约1GB(大小为(70133351,1)的矩阵)的文件 代码非常简单,但速度很慢Python 用h5py编写文件的最快方法,python,h5py,Python,H5py,首先,我读了主题“”,但它不是很有帮助 我试图加载一个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[
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
谢谢既然它只有gb,为什么不先在内存中完全加载它呢?注意,看起来您也在使用
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)
您可以使用
loadtext
将所有数据加载到numpy数组中,并使用它来实例化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">
最后,我使用图书馆的书架()将一本大词典存储到一个文件中。我只花了2天时间将散列写入一个文件,但一旦完成,我就能够非常快速地加载和访问任何元素。在一天结束的时候,我不必读我的大文件,把所有的信息都写在has中,也不必做我想用hash做的任何事情
问题解决了 从这篇文章中,你可以“把[…]读成你能拿得住的块”,也可以写非块。嗨,托妮。谢谢你指出这一点。你能给我举个例子吗?你能从文件8.txt.Oh,@user3780518中输入几行数据吗?刚刚看到你的评论。对不起,误读了。h5py数据集是数组,不是哈希表。您可能希望在此处编写自己的哈希函数,该函数可以将那些str
映射到int
,以便可以索引到数据集。h.attrs
将是一个dict,但不建议将attrs
用作数据集。hdf5中的数据集基本上可以看作是numpy数组,我认为当前方法存在一个根本问题。它对您的测试有效并不意味着它一定能工作。我喜欢使用loadtxt
,我总是忘记它。我认为,在示例中,虽然列0是int
,但这当然可以通过将预期的dtype
s传递到loadtxt
来管理。数据格式显然在这个过程中发生了变化:)谢谢@toine,但是使用您的方法,我无法查询我的数据,因为我可以使用使用慢速代码创建的结构f=h5py.File(“5.hdf5”)h=f['5']在h.attrs中打印“GFXVG”
我已经更新了顶部的问题。我相信现在更清楚了谢谢你的回答,丹尼尔。然而,我相信这并不能解决我的问题。正如我上面所说的,我需要第二列作为我的主键,而您这样做的方式是使用数字作为主键。这里的数字不能是主键,因为它们重复(可能不是我给出的小例子中的数字;我的错误)。顺便说一下,它必须是data[int(idx)]=item,而不是data[int(第[1]行])]=line[0]我已经更新了顶部的问题。我相信现在情况更清楚了