2

我正在尝试使用大约 50 GB 的大文件。我正在尝试使用 numpy 内存映射访问文件。我看到用于内存映射的文件大小有一个限制,对于 32 位系统,它是 2GB。这是链接:https ://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.memmap.html

我想知道使用 numpy 内存映射以获得良好性能是否对文件大小有硬性限制。

4

1 回答 1

5

您通常不需要担心 64-bit 的限制mmap,但我会解释原因。


首先,32 位平台理论上最多可以支持2**324GB。但是操作系统为自己保留了其中的一部分。在 Windows 上,这个块默认为 2GB(您可以将其配置为更低,但某些软件可能会中断,因为它假定使用“签名指针”是安全的),而在其他平台上它通常更像 512MB。

同样,64 位平台理论上最多可以支持2**64, 或 16EB。在这里,无论操作系统保留 512MB 还是 2GB 都不会产生重大影响。


但是,您的硬件可能会将事物限制在 44 到 56 位之间(大多数当前系统是 48 位),而 44 位只有 256TB。

而且您的操作系统可能会进一步限制事情。IIRC,最早的 64 位 linux 内核只使用了 40 位(因为当时没有硬件可以使用更多),也就是只有 1TB。

最后,在 Windows 上,如果您使用的是“基本”或“入门”版本,它可能会将 Windows 8 家庭基本版的内存进一步限制为 8GB。这是唯一可能影响您的文件的文件。


但是,与后期 32 位的情况不同,2018 年几乎没有人拥有比他们的操作系统一次可以分页更多的物理 RAM。很多人在 RAM 超过 4GB 的机器上运行 32 位 Windows(或 64 位 Windows 上的 32 位 Python),但几乎不可能使用 40 位受限操作系统加载 64 位系统具有超过 1TB 的 RAM。

因此,无论您拥有多少 RAM,您都应该能够将其中的大部分用于mmap.


有时,您想要mmap一个实际上不适合您的 RAM 的文件。然后,您将依赖操作系统的页面交换,这当然比窗口化文件的较小映射效率低,但可能足够有效,并且可能更简单。

在这种情况下,它可能会在您的系统上运行,但如果不知道比您告诉我们的更多信息,真的无法确定。最简单的答案(与 Python 一样)是 EAFP:尝试一下,并准备处理失败的异常(无论是通过编程方式,还是通过读取堆栈跟踪并在 StackOverflow 上搜索解决方案)。

于 2018-04-10T20:34:45.190 回答