gpt4 book ai didi

python - 内核在 itertools.combinations 命令后终止

转载 作者:行者123 更新时间:2023-12-01 09:17:00 24 4
gpt4 key购买 nike

我正在使用Python 3.5.2 |Anaconda 4.3.0 (x86_64)| (默认,2016 年 7 月 2 日 17:52:12)[GCC 4.2.1 兼容 Apple LLVM 4.2 (clang-425.0.28)]

我必须运行以下命令

longList = list(combinations(range(2134), 3))

我知道这个长度大约是16亿。当我运行它时,一段时间后我收到消息“内核似乎已经死亡。它将自动重新启动。”

相同的命令运行 3 次而不是 2 次没有任何问题:

longList = list(combinations(range(2134), 2))

在这种情况下我可以/应该做什么?

最佳答案

您可能内存不足。快速计算:64 位 int 或指针有 8 个字节大。您有 16 亿个元组组合。每个元组包含三个整数。这意味着您至少需要 1.6E9 * (1 + 3) * 8B = 48GB 内存。

但是,由于 Python 的内存模型,您需要的数量会多很多倍:每个整数实际上都是一个对象,因此我们需要 1 个机器字来表示列表中的指针,并且可能需要 3 或 4 个机器字来表示对象本身(我不确定细节,请阅读 CPython 源代码以了解实际的对象布局)。元组对象也会有开销。我假设每个对象都有两个单词开销。因此,我们必须额外添加 1.6E9 * (3 + 1) * 2 * 8B = 95GB 的额外开销,总共约为 143GB。

这可以通过使用密集的 numpy 数组来避免,因为它使用实数,而不是对象。这消除了整数和元组对象的所有开销,因此我们“仅”需要 1.6E9 * 3 * 8B = 35GB。

我假设您运行的硬件没有那么多内存。

您的 combinations(..., 2) 调用不是问题,因为它只会产生大约 200 万个元组,其内存需求在兆字节范围内 (2.2E6 * (1 + 4 + 2*3) * 8B = 180MB)。作为 numpy 数组,我们只需要 2.2E6 * 2 * 8B = 33MB。

那么这里的解决方案是什么?

  • 从规模上看,内存模型等低级细节即使对于 Python 也非常相关
  • 使用 numpy 可以大幅减少内存使用量,通常减少 4 倍。如果您使用较小的类型,例如 dtype='int16',则内存使用量会进一步减少 4 倍。
  • 认真思考是否需要急切地将combinations()转换为列表,或者是否可以惰性地或以较小的 block 使用迭代器

关于python - 内核在 itertools.combinations 命令后终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51153744/

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