我正在尝试弄清楚为什么会发生这种情况:
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)
正如您所看到的,将整个数据集加载到内存中,然后对其进行切片要比从数据集中取出相同的切片更快。
块大小与切片匹配,因此它应该是连续的内存,对吧?那么为什么速度慢这么多呢?
数据集使用gzip压缩(opts=2)。
根据安德鲁的评论,我运行了它,在两次读取之间清除了缓存:
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
/usr/bin/time /your/python/here
下运行不同版本的Python代码。这将显示CPU时间花费在内核/系统空间还是用户空间,并提供一些线索以了解情况。此外,在Linux上,您可以使用strace
查看两个版本中进行的系统调用。我怀疑“将所有内容读入内存”的方法只解压缩数据一次,而较慢的方法则需要多次寻找和解压缩。 - Andrew Henledata[0][:,1]
是怎么样的。 - hpaulj