[問題] 請教hdf5讀取速度問題

作者: kakar0to (Poker Face)   2021-05-14 15:03:38
請教大家一下,我有一個large size的hdf5檔案.
檔案裡面存放一個large matrix, shape是(15579,81173)
我需要從這個matrix的15579個row裡面, 隨機取出128個row出來給AI model使用.
現在遇到的問題是讀取速度很慢, 取出128個row大概要花10秒以上的時間.
想請問大家有更快讀取的作法嗎?
感謝.
以下附上程式碼.
import h5py
import numpy as np
h5 = h5py.File('file.h5', 'r')
matrix = h5['matrix/data']
random_list = np.random.randint(matrix.shape[0], size=128)
rows = matrix[random_list,:]
感謝大家回答.
作者: DavisX   2021-05-14 16:43:00
資料太大會慢正常
作者: kokolotl (nooooooooooo)   2021-05-14 19:56:00
攤平塞lmdb呢
作者: DavisX   2021-05-14 20:56:00
flatten完應該會快一點
作者: kakar0to (Poker Face)   2021-05-15 10:41:00
是否有辦法知道matrix在file的offset?我可以用c code去讀出這個matrix, 可能會比較快用c的fread與fseek去讀我想要的row
作者: a0956072892 (henk2525)   2021-05-16 19:22:00
以前有用過hdf5 chunk_shape這個參數會影響讀取速度在存hdf5時試試用(1,81173)去切
作者: lycantrope (阿寬)   2021-05-18 10:36:00
儲存成15579 * (1,81173)的hdf5
作者: kakar0to (Poker Face)   2021-05-21 22:20:00
有查到一個方法還不錯 跟大家分享一下https://gist.github.com/maartenbreddels/09e1da79577151e5f7fec660c209f06e他是先把matrix儲存成dataset, dataset可以知道file的offset, 再透過mmap mapping整個file到記憶體.再來就可以直接存取matrix了, 速度相當快.另外其實有offset之後, 也可以透過c語言的fseek,fread同樣也可以快速存取matrix
作者: lycantrope (阿寬)   2021-05-24 12:16:00
喔哦,感謝分享!

Links booklink

Contact Us: admin [ a t ] ucptt.com