使用numpy内存映射的64位系统中文件的最大大小是多少

时间:2018-04-10 20:19:22

标签: python numpy memory-mapped-files memory-mapping numpy-memmap

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

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

1 个答案:

答案 0 :(得分:3)

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

首先,32位平台理论上最多可支持2**32或4GB。但操作系统为自己保留了一大块。在Windows上,默认情况下此块大约为2GB(您可以将其配置为更低,但某些软件可能会因为它假定使用"签名指针")而在其他软件上可能会中断。平台通常更像是512MB。

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

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

你的操作系统可能会限制更远的东西。 IIRC,最早的64位Linux内核只使用40位(因为当时没有可以使用更多的硬件),只有1TB。

最后,在Windows上,如果你正在使用"基本"或" starter"对于Windows 8 Home Basic Edition,它可能会进一步限制为低至8GB。这是唯一可能影响您文件的内容。

但是,与32位后期的情况不同,2018年几乎没有人拥有比他们的操作系统可以同时寻呼所有物理RAM更多的物理RAM。很多人在拥有超过4GB内存的计算机上运行32位Windows(或64位Windows上的32位Python),但几乎不可能加载具有40-位的64位系统具有超过1TB RAM的位限制操作系统。

因此,无论你拥有多少内存,你都应该能够将大部分内容用于mmap

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

在这种情况下,它可能在您的系统上工作,但是如果不知道比您告诉我们的更多,那么确实无法肯定地说。最简单的答案(通常用于Python)是EAFP:尝试它,并准备处理它失败的异常(无论是以编程方式,还是只读取堆栈跟踪并搜索StackOverflow以获得解决方案)。