我有一个巨大的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