【问题标题】:write() itertools.combinations() result to a file and avoid MemoryErrorwrite() itertools.combinations() 将结果写入文件并避免 MemoryError
【发布时间】:2020-07-19 09:18:46
【问题描述】:

我正在尝试在 int495 大小的数组中列出所有可能的 10 元素组合。

arr 来自 [0, 1, 2,..., 493, 494]

我的代码:

from itertools import combinations_with_replacement
print(list(combinations_with_replacement(arr, 10))

输出:MemoryError

有没有办法可以在没有MemoryError 的情况下将结果保存到文件中?这样我以后可以逐行读取文件。

【问题讨论】:

  • 这样的组合超过 2*10^20 个,需要超过 10^8 TB 来存储。你想用这些数据做什么?
  • @ThierryLathuille 完全正确。忘记内存吧,即使您假设每次迭代需要 1 纳秒(在 Python 中肯定会花费更多数量级),它也需要 6896 years 来终止。

标签: python iterator combinations permutation


【解决方案1】:

iterator 的目的是按需懒惰地构建数据,在构建它的列表时,您要求构建所有数据,而不是迭代它。

with open("file.txt") as fic:
    for c in combinations_with_replacement(arr, 10):
        fic.write("".join(c) + "\n")

⚠️来自评论

  • 2.17615166796057920253 × 10^20 行大约需要10^8 TB
  • 几千年后

【讨论】:

  • 几乎可以肯定,这实际上并不能解决 OPs 问题。 OP 正在尝试使用 498 选择 10 个组合,即 2.17615166796057920253 × 10^20 ...因此它们很可能会用完磁盘空间...更不用说 time。即使假设每次迭代只需要 1 纳秒(肯定需要更多时间),也需要将近 7 千年才能完成。,..
【解决方案2】:

如果你只想遍历元素并打印它们,你可以避免创建一个包含所有元素的列表:

for x in combinations_with_replacement(arr, 10):
    print(x)

这将打印到stdout,就像您在代码中尝试的那样。您可以将其通过 shell 重定向到一个文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-06
    • 2018-07-24
    • 1970-01-01
    相关资源
    最近更新 更多