我有一個巨大的hdf5文件(〜100GB,連續存儲),我需要隨機訪問不同的點。在python/h5py或C/H5Dread中使用索引似乎很慢,因此我想直接mmap數據。mmap hdf5數據集在C/C++
實際上,這在我的本地64位Fedora 25上的h5py/numpy中可用,跟在this之後。但在遠程集羣上,儘管python似乎是64位,並且使用C中的mmap對100GB文件進行了簡單測試,但大型文件([Errno 12] Cannot allocate memory
)的numpy/mmap失敗。所以我的集羣的Python可能有問題。
我看到的一個解決方案是在C中使用mmap。我寫了一個小的test來創建一個帶有1d數據集的小型hdf5,並使用`H5Dget_offset'獲取數據集偏移量。但是,結果不正確。
以下是核心代碼:根據本blog
/* Get dataset offset within file */
file_id = H5Fopen (FILE, H5F_ACC_RDONLY, H5P_DEFAULT);
dataset_id = H5Dopen2(file_id, "/dset", H5P_DEFAULT);
offset = H5Dget_offset(dataset_id);
fd = open(FILE, O_RDONLY);
// align with page size
pa_offset = offset & ~(sysconf(_SC_PAGE_SIZE) - 1);
length = NX * NY * sizeof(int);
addr = mmap(NULL, length + offset - pa_offset, PROT_READ,
MAP_PRIVATE, fd, pa_offset);
討論提到朱莉婭實施通過H5Fget_vfd_handle
和H5Dget_offset
來實現這一點,但我還沒有找到一個詳細的/容易解釋。
- 我通過蟒蛇有偏移/ h5py的
dataset.id.get_offset
是相同的,我通過H5Dget_offset
在C. - 了,我認爲我的核心問題是:如何使用C'S
H5Dget_offset
指定的偏移量的mmap數據集。 mmap
應該比原來的hdf5訪問速度快得多嗎?
爲什麼內存映射,而不是隻是尋求和閱讀? – tadman
@tadman,「尋求和閱讀」是指直接索引?我試過了,但那很慢。我不知道索引是否會帶來額外的開銷?對於我來說,每次我只能隨機訪問一個數據點並且不停地循環,而不是切片,這是hdf5使用的典型情況。 – Liang
如果你在[無緩衝模式](https://stackoverflow.com/questions/20342772/buffered-and-unbuffered-inputs-in-c)中打開文件,那麼你有相當直接的,原始的,低級別的訪問文件。使用'fseek' /'fread',你可以從任何你想要的地方獲取數據,隨機存取。默認情況下,文件讀取被緩衝,這可能會拖累性能,除非您正在進行線性讀取。 – tadman