内存映射,例如通过Python 的 numpy.memmap
,虽然只是暂时的,但仍然有效;一旦页面文件容量超出,阵列就会从页面文件中悄悄取消映射。每次都重新映射是不可取的 - 需要持久性。此外,我不知道如何看法页面文件——即查看其内容。
有可能的使用:使用 SSD 页面文件作为“伪 RAM”,以 10% 的 RAM 读取速度将整个数据集加载到内存中(但每次只读取 500MB)来加速深度学习。
如何实现?如能提供帮助,我们将不胜感激。
眼镜:
- 系统:Win-10 操作系统,华硕 ROG StrixGL702VSK
- 固态硬盘:512GB,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(在这种情况下,将允许对内存数组进行更改,但这些更改不会被写入磁盘,并且在进程退出时将丢失)。