【问题标题】:MemoryError when generating every possible combination of letters and numbers with a length of 6 [duplicate]生成长度为 6 的字母和数字的所有可能组合时出现 MemoryError [重复]
【发布时间】:2015-09-27 00:43:37
【问题描述】:

我正在尝试输出包含字母和数字的每个可能的 6 长度组合的列表。

我为此尝试了许多不同类型的代码,这个似乎是最好的,但它不适用于我使用它的长时间。

import itertools
import pprint
letters = ["A","B","C","D","E","F","G","H","I","J","K","L","M",
          "N","O","P","Q","R","S","T","U","V","W","X","Y","Z",
          "0","1","2","3","4","5","6","7","8","9"]
pprint.pprint(list(itertools.product(letters, repeat=6)))

当我运行这个时,我得到这个错误:

MemoryError

它确实适用于小于 5 的重复集。

我该如何解决这个问题?有没有更简单或更好的方法来获得相同的结果?是否可以将其输出到文本文件而不必打印?我不在乎是否有重复,但如果没有重复的话会更好。

这个网站:textmechanic.com/Combination-Generator.html 也做了我想做的事情,但它不适用于我正在使用的大量对象和组合的长度。如果已经有这样的列表,那就可以了。

或者是不可能完成这件事?

【问题讨论】:

    标签: python python-3.x out-of-memory combinations permutation


    【解决方案1】:

    您正在尝试创建一个包含 36 ** 6 = 2176782336 个 6 个 1 字符字符串的元组的列表。超过 20 亿(2 亿)。这需要至少 210 GB 的内存,只是来保存元组对象(在我的 Mac 上每个 104 字节小)。

    不要试图产生一个列表;打印生成的值,然后再次丢弃它们:

    for combo in itertools.product(letters, repeat=6):
        print(''.join(combo))
    

    要将其写入文件,请将str.join() 结果加上换行符:

    with open('outputfile.txt', 'w') as outfile:
        for combo in itertools.product(letters, repeat=6):
            outfile.write(''.join(combo) + '\n')
    

    这需要很少的 RAM,但您需要 14GB 的磁盘空间来存储 20 亿乘以 7 的字符(包括换行符)。

    【讨论】:

    • 是的,我计算了 2176782336 但我不知道这意味着 12GB 内存。有点话题,但你的意思是我需要 12GB 的 RAM 还是只需要硬盘空间?刚感兴趣。
    • @Yami:那是 12GB 的磁盘空间。 Python 对象至少需要 113GB 内存。
    • @Yami:抱歉,应该是 210GB;我使用了一个空元组的大小,但是对于 6 个值,每个元组的内存占用量是 104 个字节。
    • @Yami:20 亿个 6 个字符的字符串,加上换行符,实际上是 140 亿个字符,因此所有这些字符串需要 14GB 的磁盘空间。
    • 等待这是否意味着完成后将占用 210GB 的磁盘空间??? Python 对象的内存到底是什么意思?当我打印所有这些或将其保存到文件时,需要多少空间?感谢您提供此信息。
    【解决方案2】:

    您实际上是要求在一个列表中预先生成所有此类组合,然后一次性打印它们。

    您可以做的是避免这种情况,方法是不调用list(...),而是在迭代器生成它们时动态打印它们。

    这是一个例子。它不是原始格式,但可以完成工作。

    import itertools
    import pprint
    letters = ["A","B","C","D","E","F","G","H","I","J","K","L","M",
              "N","O","P","Q","R","S","T","U","V","W","X","Y","Z",
              "0","1","2","3","4","5","6","7","8","9"]
    for item in itertools.product(letters, repeat=6):
        pprint.pprint(item)
    

    【讨论】:

    • 太棒了!这很好用,就像我想要的那样。但是我怎样才能将它输出到 .txt 文件中呢?我知道如何写入文件,但我应该写其中的哪一部分?我只是做 file.write(pprint.pprint(item)) 还是我可以做 variable = pprint.pprint(item) 然后写?编辑:没关系,我让它工作。谢谢:)
    猜你喜欢
    • 2015-03-17
    • 1970-01-01
    • 2022-01-04
    • 2015-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多