我需要从一组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()
谢谢!
答案 0 :(得分:4)
itertools.combinations
会替换你的usable_combos = list(combos)
循环,而不是你应该这样做。)
由于您正在将它们写入文件,因此您可以在从迭代器获取文件时将每个组合写入文件,而不是创建列表。现在,您是否需要将其格式化为Python列表的for
?因为如果没有,这会更有意义:
repr
注意:由于分析而改为使用for combo in combos:
text_file.write(str(combo) + "\n")
。
如果您希望它与列表的"{}\n".format(combo)
一样,则需要自己编写repr
和[
,并使用逗号而不是换行符。
<强> - 更多 - 强>
根据评论中的更新 - 如果您正在寻找特定的组合,最好的位置可能是在将它们写入文件之前,因为否则您只需要从文件中加载它们并查看在他们身上。如果您将根据某些条件选择一小部分可用组合,请事先选择它们将会减少您的工作。
一般情况下,你也可以在不必学习实际C的情况下更快地查看Cython,如果你真的想要对你自己计算机以外的内存要求进行暴力破解,那么适当大小的EC2实例就在附近。每小时20美分。
答案 1 :(得分:3)
您内存不足的一个原因是(正如您所说的那样):55 choose 6 = 28,989,675
现在,想想确切地说有多少内存。我们可以执行一个快速的包络计算来估计需要多少内存:
由于您的列表使用了浮点数和整数,我们可以推断出内存消耗的上限为:
sys.getsizeof(float())
<强> Which on a 64 bit machine is 24 bytes, and on a 32 bit machine is 16 bytes 强>
并且,因为元组占用:56 + 8 * len(t) bytes
(64 bit)
因此,计算的上限将采用:
28,989,675 * 6 * 24 + 28,989,675 * (56 + 8 * 6) bytes ~ 6,856.39 MiB
内存(64位)28,989,675 * 6 * 16 + 28,989,675 * (56 + 8 * 6) bytes ~ 5,529.34 MiB
内存(32位)Recalling that Python lists are implemented contiguously (for O(1) lookup time),这是它崩溃的可能原因,因为你还必须考虑操作系统和RAM中其他程序占用的内存。
将此与您引用的其他示例进行比较:连续内存的55 choose 4 = 341,055 => ~ 59.85 MiB (64 bit)
或~49.44 MiB (32 bit)
。由于这是一个非常合理的内存量,可以连续运行,因此运行没有问题。