我需要从55个集合中生成6个数字的每个组合。我相信该组合集合中有28,989,675个索引。我想我的内存不足了,因为我可以生成具有4个数字的组合,但没有比这大的数字。我该如何解决这个问题?

我正在使用从此处的教程借来的一些代码的修改:https://www.youtube.com/watch?v=VyXDQxuIwPU

import itertools

text_file = open("comb3.txt", "w")

harmonics = [28, 33, 36, 38, 40, 43, 45, 47, 48, 50, 52, 55, 55.86, 57, 59, 60, 60.86, 61.69, 62, 63.86, 64, 65.86, 66, 66.69, 67, 69, 69.69, 70.86, 71, 71.69, 72, 74, 75.86, 76, 76.69, 77.86, 79, 81, 81.69, 82.86, 83.69, 84, 84.86, 86, 88, 88.69, 89.86, 90.69, 91, 93, 95, 95.69, 96.86, 98, 100]

combos = itertools.combinations(harmonics, 4)

usable_combos = []
for e in combos:
    usable_combos.append(e)

print usable_combos

s = str(usable_combos)

text_file.write(s)
text_file.close()


谢谢!

最佳答案

itertools.combinations这样的迭代器一次只能生成一段数据,这相对来说是内存有效的。但是,当您将所有值放入列表中时,您需要内存来一次存储所有值(顺便说一句,usable_combos = list(combos)会替换您的for循环,而不是您应该这样做)。

由于要将它们写入文件,因此可以在从迭代器获取文件时将每个组合写入文件,而无需创建列表。现在,您是否需要将其格式化为Python列表的repr?因为如果没有,这将更有意义:

for combo in combos:
    text_file.write(str(combo) + "\n")


注意:由于配置文件,使用"{}\n".format(combo)进行了更改。

如果要像列表的repr一样,则需要自己编写[],并用逗号代替换行符。

-更多-

根据注释中的更新-如果要查找特定的组合,查找它们的最佳位置可能是在将它们写入文件之前,因为否则,您只需要从文件中加载它们并查看所有内容即可再次。如果您将根据某些条件选择一小部分可用组合,则提前选择它们会在以后减少您的工作。

通常,您还可以在不学习实际C的情况下提高Cython的速度,并且如果您真的想强行使用某些内存需求超出您自己计算机的东西,则大小合适的EC2实例大约为20美分。小时。

关于python - 创建集合的所有组合并耗尽内存,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25356497/

10-11 15:22
查看更多