代码之家  ›  专栏  ›  技术社区  ›  Adelov

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

  •  0
  • Adelov  · 技术社区  · 6 年前

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

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

    但是我遇到了一个内存问题,进程被终止了,我使用的是一台强大的机器,内存为64GB,所以有什么解决方案吗?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Selcuk    6 年前

    您正在尝试生成一个包含2^40(即超过1万亿)个列表的列表,每个列表包含40个整数元素。自从Python int s的长度为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) (但你已经知道结果了,不是吗?)而且你不能切。