我需要从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/