【问题标题】:64 bit Python causes freeze64 位 Python 导致冻结
【发布时间】:2017-01-28 06:17:54
【问题描述】:

作为编程新手,我正在用这个脚本玩 Python:

import itertools
Lists=list(itertools.permutations(['a','b','c','d','e','f','g','h','i','j','k']))
print(len(Lists))

在 32 位 Python 上,它会导致内存溢出错误。但是,当在 64 位 Python 上尝试它并观看任务管理器时,Python 使用 4 GB 内存(我有 8 GB RAM)然后我的计算机死机,我必须重新启动它。

这是正常行为吗?我该如何解决这个问题,或者限制 Python 可以访问多少内存?

此外,如果我将这样的内容转换为 .exe 文件(将此脚本用作测试其他内容),它会冻结其他计算机吗?

【问题讨论】:

    标签: python memory-management


    【解决方案1】:

    函数itertools.permutations() 返回一个生成器,该生成器按字典顺序懒惰地计算给定序列的所有可能排列。然后,您的代码将所有这些排列显式存储在 list 中。

    您的序列包含 11 个字母。对于您的输入,有 11 个! = 39 916 800 个排列。 Python 的内存效率不是特别高;对于 4000 万个排列中的每一个,都需要存储这些值:

    • 指向列表对象的指针。 (64 位 Python 上 8 个字节)
    • 列表容器本身,包含 11 个指向字符串和松弛空间的指针。 (8×8字节)

    因此,每个排列至少使用 96 个字节。添加一些填充和杂项浪费,我们可以估计每个排列使用 150 字节的内存。将其乘以 4000 万,我们得到 6 GB。


    如此高的内存使用率解释了为什么您的程序在 32 位 Python 上死机(不能使用超过 4 GB 的 RAM,并且实际上受到 2 GB 的限制)。此外,当进程消耗大量内存时,如果启用,可能会导致页面/交换文件抖动。

    限制 Python 内存限制的一种方法是通过操作系统提供的机制,例如ulimit。另一种方法是咨询resource module

    【讨论】:

    • 谢谢你,你的回答很有道理。 python不应该先给我一个溢出错误而不是冻结我的电脑吗?就像上面的那个人说的那样,虽然它并没有真正回答很多被问到的问题:P 谢谢
    • 在 Python 3.5 上,使用 getsizeof(permutations) + sum(getsizeof(p) for p in permutations) 估计的内存使用量为 5.786255888 GB
    • 感谢您的建议,我使用的是 Windows 10,因此无法使用“ulimit”,当我尝试导入资源时,我得到模块未找到错误 - “没有名为“资源”的模块。”也许我应该防止使用这个函数生成超过一定大小的数组?
    猜你喜欢
    • 1970-01-01
    • 2014-06-09
    • 2012-08-02
    • 1970-01-01
    • 1970-01-01
    • 2019-12-16
    • 1970-01-01
    • 2018-10-03
    • 1970-01-01
    相关资源
    最近更新 更多