我不知道您为什么认为您的进程应该能够访问4GB。根据MSDN上Windows发行版的内存限制,在64位Windows 7上,默认的32位进程获得2GB。*这正是它耗尽的地方。
那么,有办法解决吗?
好吧,您可以使用该
IMAGE_FILE_LARGE_ADDRESS_AWARE标志进行自定义的32位Python构建,然后重新构建
numpy以及所有其他扩展模块。我不能保证所有相关的代码都可以通过大地址感知标志真正安全地运行。这是一个好机会,但是除非有人已经做过并对其进行了测试,否则“好机会”是任何人都可能知道的最好的机会。
或者,更明显的是,仅使用64位Python。
物理RAM的数量是完全无关的。您似乎认为您拥有8GB RAM的“ 8GB限制”,但这不是它的工作原理。您的系统将占用所有RAM 以及所需的任何交换空间
,并将其分配给应用程序;一个应用程序即使在8GB的计算机上也可能能够获得20GB的虚拟内存而不会出现内存错误。同时,一个32位应用程序无法访问超过4GB的空间,并且该操作系统将占用部分地址空间(默认情况下为Windows的一半),因此即使在8GB的计算机上,您也只能获得2GB的空间。那没什么其他的。(并不是说在现代操作系统上可能永远“不运行其他任何东西”,但是您知道我的意思。)
那么,为什么这在您的Linux机器上有效呢?
因为您的Linux机器被配置为可以为32位进程提供3.5GB的虚拟地址空间,或3.99GB或………好吧,我无法告诉您确切的数字,但是多年来我见过的每个发行版都已配置至少需要3.25GB。
*还请注意,您甚至没有真正获得全部2GB的数据;您的程序。操作系统及其驱动程序可让您的代码访问的大多数内容都位于另一半,而您加载的每个DLL,所需的任何空间以及各种其他内容则位于另一半。总计不算太多,但不为零。



