我有一个带有100个“事件”的HDF5。每个事件包含变量,但大约有180个组称为“跟踪”,每个跟踪都包含6个数据集,这些数据集由32位浮点数组成,每个单元格长度为1000个(这在每个事件之间略为携带,但在事件中保持不变)。该文件是用默认的h5py设置生成的(因此,除非h5py自己执行,否则不会分块或压缩)。
读数不快。它比从CERN根TTrees读取相同数据的速度慢6倍。我知道HDF5不是市场上最快的格式,但如果您能告诉我速度在哪里丢失,我将不胜感激。
若要以跟踪方式读取数组,请执行以下操作:
d0keys = data["Run_0"].keys()
for key_1 in d0keys:
if("Event_" in key_1):
d1 = data["Run_0"][key_1]
d1keys = d1.keys()
for key_2 in d1keys:
if("Traces_" in key_2):
d2 = d1[key_2]
v1, v2, v3, v4, v5, v6 = d2['SimSignal_X'][0],d2['SimSignal_Y'][0],d2['SimSignal_Z'][0],d2['SimEfield_X'][0], d2['SimEfield_Y'][0],d2['SimEfield_Z'][0]行分析器显示,97%的时间花在最后一行。现在,有两个问题:
中获得。
那么h5py在哪里失去了它的速度呢?我想纯粹的读出应该只是硬盘的速度。因此,瓶颈是:
将it)?
中执行HDF5内存)
如果有线索我会很感激的。
发布于 2021-04-25 16:45:27
有许多HDF5 I/O问题需要考虑。我会尽力把每一件事都包括进去。
从我的测试来看,I/O所花费的时间主要取决于读/写的次数,而不是读/写的数据量(以MB计)。请阅读此文章以获取更多详细信息:pytables writes much faster than h5py. Why?注意:它显示了h5py和PyTables具有不同I/O写入大小的固定数量数据的I/O性能。基于此,大部分时间都花在最后一行中是有意义的--这就是您将数据从磁盘读取到内存的NumPy数组(v1, v2, v3, v4, v5, v6)的位置。
关于你的问题:
d2['SimSignal_X'][0]和d2['SimSignal_X'][:]没有区别是有原因的。两者都将整个数据集读入内存(所有~1000个数据集值)。如果只想读取数据的一个片段,则需要使用切片表示法。例如,d2['SimSignal_X'][0:100]只读取前100个值(假设d2['SimSignal_X']只有一个轴- shape=(1000,))。注意:读取片将减少所需内存,但不会提高I/O读取时间。(事实上,读取切片可能会增加读取时间。)v1, v2, v3, v4, v5, v6 = d2['SimSignal_X'], d2['SimSignal_Y'], d2['SimSignal_Z'], d2['SimEfield_X'], d2['SimEfield_Y'], d2['SimEfield_Z']。注意如何不使用片表示法( [:]).[0]发现PyTables比h5py快。您的代码可以很容易地转换为使用PyTables.是否启用了压缩
https://stackoverflow.com/questions/67253941
复制相似问题