gpt4 book ai didi

64 位 Windows 上的 Python 32 位内存限制

转载 作者:太空宇宙 更新时间:2023-11-03 21:18:53 25 4
gpt4 key购买 nike

我遇到了一个我似乎无法理解的内存问题。

我使用的是 Windows 7 64 位机器,内存为 8GB,正在运行 32 位 python 程序。

程序读取 5,118 个压缩的 numpy 文件 (npz)。Windows 报告这些文件在磁盘上占用了 1.98 GB

每个npz文件包含两条数据:'arr_0' 的类型为 np.float32 并且'arr_1' 的类型为 np.uint8

Python 脚本读取每个文件,将其数据附加到两个列表中,然后关闭该文件。

在文件 4284/5118 附近,程序抛出 MemoryException

但是任务管理器显示错误发生时python.exe *32的内存使用量为1,854,848K ~= 1.8GB。远低于我的 8 GB 限制,或者 32 位程序假定的 4GB 限制。

在程序中我发现内存错误并报告:每个列表的长度为 4285。第一个列表总共包含 1,928,588,480 个 float32 的 ~= 229.9 MB 数据。第二个列表包含 12,342,966,272 uint8 的 ~= 1,471.3MB 数据。

所以,一切似乎都在检查中。除了我遇到内存错误的部分。我绝对有更多的内存,并且它崩溃的文件约为 800KB,因此它在读取大文件时不会失败。

此外,文件没有损坏。如果我没有事先用完所有内存,我可以很好地阅读它。

更令人困惑的是,所有这些似乎在我的 Linux 机器上运行良好(尽管它确实有 16GB 内存,而我的 Windows 机器上有 8GB),但它似乎仍然不是该机器的导致此问题的 RAM。

当我期望 Python 应该能够再分配 2GB 数据时,为什么它会抛出内存错误?

最佳答案

我不知道为什么你认为你的进程应该能够访问 4GB。根据Memory Limits for Windows Releases在 MSDN 上,在 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 和它们所需的任何空间以及各种其他东西都位于您的一半。加起来并不算太多,但也不是零。

关于64 位 Windows 上的 Python 32 位内存限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54467200/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com