gpt4 book ai didi

python - 为什么读取整个 hdf5 数据集比读取切片更快

转载 作者:太空狗 更新时间:2023-10-29 21:57:44 25 4
gpt4 key购买 nike

我想弄清楚为什么会这样:

In [1]: import time, h5py as h5
In [2]: f = h5.File('myfile.hdf5', 'r')
In [3]: st = time.time(); data = f["data"].value[0,:,1,...]; elapsed = time.time() - st;
In [4]: elapsed
Out[4]: 11.127676010131836
In [5]: st = time.time(); data = f["data"][0,:,1,...]; elapsed2 = time.time() - st;
In [6]: elapsed2
Out[6]: 59.810582399368286
In [7]: f["data"].shape
Out[7]: (1, 4096, 6, 16, 16, 16, 16)
In [8]: f["data"].chunks
Out[8]: (1, 4096, 1, 16, 16, 16, 16)

如您所见,将整个数据集加载到内存中然后提取切片比从数据集中提取相同切片更快。

block 大小与切片匹配,所以它应该都是连续的内存,对吧?那为什么这么慢呢?

数据集使用 gzip (opts=2) 压缩。

根据 Andrew 的评论,我运行它以清除两次读取之间的缓存:

elapsed1: 11.001180410385132
elapsed2: 43.19723725318909
48.61user 4.45system 0:54.65elapsed 97%CPU (0avgtext+0avgdata 8431596maxresident)k
479584inputs+0outputs (106major+3764414minor)pagefaults 0swaps

(下一次运行在两次读取之间有 10 秒的延迟以清除缓存)

elapsed1: 11.46790862083435
elapsed2: 43.438515186309814

48.54user 4.66system 1:05.71elapsed 80%CPU (0avgtext+0avgdata 8431944maxresident)k
732504inputs+0outputs (220major+3764449minor)pagefaults 0swaps

最佳答案

首先,我进行了自己的测试。我没有你的 HDF5 文件,所以使用我的一个测试文件。我的测试表数据集有大约 54,000 行(看起来比你的大)。
.value[] 的计时结果给出

>>> elapsed
0.15540122985839844

使用 NumPy 索引的计时结果为:

>>> elapsed2
0.12980079650878906

因此,我看不出性能有太大差异。可能和我们测试的数据集大小,或者数据表的复杂度有关?

最新的 h5py 文档有一些关于 Dataset.value 的有趣评论(来自 2.8.0 版 - 2018 年 6 月 5 日;强调我的):
Dataset.value 属性现已弃用。
可追溯到 h5py 1.0 的属性 Dataset.value 已弃用,并将在以后的版本中删除。此属性将整个数据集转储到 NumPy 数组中。 使用 .value 的代码应更新为使用 NumPy 索引,使用 mydataset[ ...]mydataset[()] 视情况而定。

您的计时测试似乎与上面突出显示的观察结果相反。

我认为您需要请 h5py 开发人员评论性能差异(以及数据的存储位置——在内存中还是在磁盘上)。你查过h5py user group了吗? ?

编辑:发布后,我发现了这个SO Q&A。它有很多好评,包括 h5py 开发人员的回复:
h5py: Correct way to slice array datasets

关于python - 为什么读取整个 hdf5 数据集比读取切片更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53458612/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com