如何在页面文件中存储数据?

如何在页面文件中存储数据?

内存映射,例如通过Python 的 numpy.memmap,虽然只是暂时的,但仍然有效;一旦页面文件容量超出,阵列就会从页面文件中悄悄取消映射。每次都重新映射是不可取的 - 需要持久性。此外,我不知道如何看法页面文件——即查看其内容。

有可能的使用:使用 SSD 页面文件作为“伪 RAM”,以 10% 的 RAM 读取速度将整个数据集加载到内存中(但每次只读取 500MB)来加速深度学习。

如何实现?如能提供帮助,我们将不胜感激。


眼镜

  • 系统:Win-10 操作系统,华硕 ROG StrixGL702VSK
  • 固态硬盘:512G​​B,3.5GB/s 读取速度-- NVMe PCIe970 PRO
  • 页面文件:80GB,位于 C 盘(SSD 驱动器、系统驱动器)
  • 内存:24GB DDR4 2.4-MHz
  • 中央处理器i7-7700HQ 2.8 GHz

答案1

将数据存储在页面/交换文件中(pagefile.sys在 Windows 上)意味着将其存储在虚拟内存中。如果这确实是您想要的,那么只要您以通常的方式分配数组,您就已经在这样做了。

虚拟 RAM 与物理 RAM 一样,在重启后无法继续存在。无法将数据永久存储在页面文件中。从技术上讲,这是可以做到的,因为它是持久介质上的文件,但它并不是为此而设计的。它的目的是模拟物理 RAM。

听起来你真正想要的是将你的 numpy 数组存储在不是页面文件中,而是普通的磁盘文件中 - 这与你的标题相反。

我从来没有这样做过,但根据你链接的文档,

使用此子类的另一种方法是自己创建 mmap 对象,然后直接使用 ndarray.__new__ 创建一个 ndarray,并将创建的对象传递到其“buffer=”参数中。

这意味着您应该能够像这样创建数组数据:

file = open('backing_file', 'xb')
mapped_data = mmap.mmap(file.fileno(), 123456 * 4, access=mmap.ACCESS_WRITE)
array = np.ndarray.__new__(shape=(123456,), buffer=mapped_data, dtype='float32')
# fill in the array

然后,在后续运行中,将数组映射到内存中,如下所示:

file = open('backing_file', 'rb')
mapped_data = mmap.mmap(file.fileno(), 123456 * 4, access=mmap.ACCESS_READ)
array = np.ndarray.__new__(shape=(123456,), buffer=mapped_data, dtype='float32')
# use the array

后续运行的启动时间将非常快;读取时,数组数据将从磁盘分页。

除了 mmap.ACCESS_READ,您还可以传递 mmap.ACCESS_WRITE(在这种情况下,对内存数组的任何更改都将传播到磁盘)或 mmap.ACCESS_COPY(在这种情况下,将允许对内存数组进行更改,但这些更改不会被写入磁盘,并且在进程退出时将丢失)。

这是 mmap 模块的文档。

相关内容