[英]Why is it faster to read whole hdf5 dataset than a slice
我想弄清楚為什么會這樣:
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
)壓縮數據集。
在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用戶組嗎?
編輯:發布后,我發現了這個問答。 它有很多好的評論,包括來自h5py開發者的回復:
h5py:切片陣列數據集的正確方法
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.