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

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[

首先,我读了主题“”,但它不是很有帮助

我试图加载一个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

谢谢

既然它只有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]我已经更新了顶部的问题。我相信现在情况更清楚了