尝试生成2exp(40)矩阵时出现内存问题

时间:2019-11-24 23:37:22

标签: python optimization binary genetic-algorithm

我试图生成所有可能的长度为40的二进制数,所以我使用了以下代码:

l = list(itertools.product([0, 1], repeat=40))

但是我遇到了一个内存问题,该进程被杀死,并且我正在使用具有64GB RAM的功能强大的计算机,那么这个问题有什么解决方案吗?

1 个答案:

答案 0 :(得分:2)

您正在尝试生成2 ^ 40(即超过1万亿个)列表,每个列表包含40个整数元素。由于Python int的长度为24个字节,即使使用最基本的假设(不计算列表开销等),也需要960 TB的RAM。

不是的解决方案是尝试将生成器转换为列表并直接使用生成器:

>>> l = itertools.product([0, 1], repeat=40)
>>> l.next()
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
>>> l.next()
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1)
>>> l.next()
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0)
...

问题是您无法len(l)(但是您已经知道结果了,不是吗?)并且您无法对其进行切片。