我正在尝试使用大文件〜大约50 GB。我试图使用numpy内存映射访问文件迭代。我发现用于内存映射的文件大小有限制,对于32位系统来说是2GB。这是链接:https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.memmap.html
我想知道使用numpy内存映射是否存在文件大小的硬限制,以获得良好的性能。
答案 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以获得解决方案)。