c语言 打开hdf5文件,如何加速从压缩的HDF5文件读取

我有几个大的HDF5文件存储在SSD上(lzf压缩文件的大小是10-15gb,未压缩的大小是20-25gb)。将这样一个文件的内容读入RAM以进行进一步处理,每个文件大约需要2分钟。在此期间,只有一个核心被利用(但达到100%)。所以我想在CPU上运行的解压部分是瓶颈,而不是SSD的IO吞吐量。在

在我的程序开始时,它将多个类似的文件读入RAM,这需要相当长的时间。

我喜欢通过使用更多的内核和最终更多的RAM来加快这个过程,直到SSD IO吞吐量成为限制因素。我正在工作的机器有足够的资源(20个CPU内核[+20 HT]和400 GB RAM),只要节省时间,浪费RAM也没什么大不了的。在

我自己有两个想法:

1)使用python的multiprocessing模块并行地将多个文件读入RAM。这在原则上是可行的,但是由于在multiprocessing中使用了Pickle(如所述here),我达到了4GB序列化限制:OverflowError('cannot serialize a bytes object larger than 4 GiB').

2)进行多个进程(使用multiprocessing模块中的Pool)打开同一个HDF5文件(使用with h5py.File('foo.h5', 'r') as h_file:),从中读取一个单独的块(chunk = h_file['label'][i : i + chunk_size]),并返回该块。然后将收集的块连接起来。但是,如果OSError: Can't read data (data error detected by Fletcher32 checksum).

这是因为我在多个进程中打开了同一个文件(如建议的here)?在

所以我的最后一个问题是:如何更快地将.h5文件的内容读入主内存?再次重申:为了节省时间而浪费内存是允许的。内容必须驻留在主内存中,所以仅仅通过读取行或分数来规避问题不是一种选择。

我知道我可以只存储未压缩的.h5文件,但这只是我喜欢使用的最后一个选项,因为SSD上的空间很少。我更喜欢haven-both,压缩文件和快速读取(最好是更好地利用可用资源)。在

元信息:我使用python3.5.2和h5py2.8.0。在

编辑:在读取文件时,SSD的工作速度是72mb/s,远远不是它的最大速度。.h5文件是通过使用h5py的dataset.html#creating-datasets" rel="nofollow noreferrer">^{}方法和compression="lzf"选项创建的。在

编辑2:这是(简化)我用来读取(压缩)HDF5文件内容的代码:def opener(filename, label): # regular version

with h5py.File(filename, 'r') as h_file:

data = g_file[label][:]

return data

def fast_opener(filename, label): # multiple processes version

with h5py.File(filename, 'r') as h_file:

length = len(h_file[label])

pool = Pool() # multiprocessing.Pool and not multiprocessing.dummy.Pool

args_iter = zip(

range(0, length, 1000),

repeat(filename),

repeat(label),

)

chunks = pool.starmap(_read_chunk_at, args_iter)

pool.close()

pool.join()

return np.concatenate(chunks)

def _read_chunk_at(index, filename, label):

with h5py.File(filename, 'r') as h_file:

data = h_file[label][index : index + 1000]

return data

如您所见,解压缩是由h5py透明地完成的。在

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值