gpt4 book ai didi

python - 有没有办法用 POSIX_FADV_DONTNEED 标志打开 hdf5 文件?

转载 作者:行者123 更新时间:2023-12-04 18:31:24 25 4
gpt4 key购买 nike

我们正在使用 Python 中的 h5py 处理大型 (1.2TB) 未压缩、未分 block 的 hdf5 文件,用于机器学习应用程序,这需要我们反复处理整个数据集,以随机顺序单独加载约 15MB 的切片。我们正在使用 192 GB RAM 的 linux (Ubuntu 18.04) 机器。我们注意到程序正在缓慢地填充缓存。当缓存的总大小达到与全机 RAM 相当的大小时(空闲内存几乎为 0,但有大量“可用”内存),交换会降低所有其他应用程序的速度。为了查明问题的根源,我们编写了一个单独的最小示例来隔离我们的数据加载过程 - 但发现问题与我们方法的每个部分无关。

我们尝试了:
构建 numpy memmap 并访问请求的切片:

#on init:
f = h5py.File(tv_path, 'r')
hdf5_event_data = f["event_data"]
self.event_data = np.memmap(tv_path, mode="r", shape=hdf5_event_data.shape,
offset=hdf5_event_data.id.get_offset(),dtype=hdf5_event_data.dtype)
self.e = np.ones((512,40,40,19))

#on __getitem__:
self.e = self.event_data[index,:,:,:19]
return self.e

在每次调用 getitem 时重新打开 memmap:
#on __getitem__:
self.event_data = np.memmap(self.path, mode="r", shape=self.shape,
offset=self.offset, dtype=self.dtype)
self.e = self.event_data[index,:,:,:19]
return self.e

直接寻址 h5 文件并转换为 numpy 数组:
#on init:
f = h5py.File(tv_path, 'r')
hdf5_event_data = f["event_data"]
self.event_data = hdf5_event_data
self.e = np.ones((512,40,40,19))

#on __getitem__:
self.e = self.event_data[index,:,:,:19]
return self.e

我们还在 pytorch Dataset/Dataloader 框架中尝试了上述方法 - 但没有任何区别。

我们观察到高内存碎片,如/proc/buddyinfo 所示。通过同步删除缓存; echo 3 >/proc/sys/vm/drop_caches 在应用程序运行时没有帮助。在应用程序启动之前清理缓存会消除交换行为,直到缓存再次耗尽内存 - 并且交换再次开始。

我们的工作假设是系统试图保留缓存的文件数据,这会导致内存碎片。最终,当请求新内存时,即使大多数内存仍然“可用”,也会执行交换。

因此,我们转向改变 Linux 环境围绕文件缓存的行为的方法,并找到了这篇文章。在 python 中打开 h5 文件或我们通过 numpy memmap 访问的部分文件时,有没有办法调用 POSIX_FADV_DONTNEED 标志,这样就不会发生这种缓存积累?在我们的用例中,我们不会在很长一段时间内重新访问该特定文件位置(直到我们访问文件的所有其他剩余“切片”)

最佳答案

您可以使用 os.posix_fadvise 告诉操作系统您计划加载的区域将如何使用。这自然需要进行一些低级调整来确定您的文件描述符,并了解您计划读取的区域。

获取文件描述符的最简单方法是自己提供:

pf = open(tv_path, 'rb')
f = h5py.File(pf, 'r')

您现在可以设置建议。对于整个文件:
os.posix_fadvise(os.fileno(pf), 0, f.id.get_filesize(), os.POSIX_FADV_DONTNEED)

或者对于特定的数据集:
os.posix_fadvise(os.fileno(pf), hdf5_event_data.id.get_offset(),
hdf5_event_data.id.get_storage_size(), os.POSIX_FADV_DONTNEED)

其他看点

H5py 自己做 chunk caching .您可能想尝试将其关闭:
f = h5py.File(..., rdcc_nbytes=0)

作为替代方案,您可能想尝试使用其他 drivers 之一。在 h5py 中提供,如 'sec2' :
f = h5py.File(..., driver='sec2')

关于python - 有没有办法用 POSIX_FADV_DONTNEED 标志打开 hdf5 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62415606/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com