【问题标题】:How much memory in numpy array? Is RAM a limiting factor?numpy数组中有多少内存? RAM是限制因素吗?
【发布时间】:2012-06-30 11:49:27
【问题描述】:

我正在使用 numpy 创建一个边长为 100 的立方体数组,因此总共包含 100 万个条目。对于百万个条目中的每一个,我都插入了一个 100x100 矩阵,其条目由随机生成的数字组成。我正在使用以下代码:

import random
from numpy import *

cube = arange(1000000).reshape(100,100,100)

for element in cube.flat:
    matrix = arange(10000).reshape(100,100)
    for entry in matrix.flat:
        entry = random.random()*100
    element = matrix

我原以为这需要一段时间,但由于生成了 100 亿个随机数,我不确定我的计算机能否处理它。这样的数组会占用多少内存? RAM 会是一个限制因素,即如果我的计算机没有足够的 RAM,它会无法实际生成数组吗?

另外,如果有更高效的代码来实现,我会很感激提示:)

【问题讨论】:

  • 假设 double 精度,每个 8 字节,如果你真的想存储 100 亿个,那就是 80GB。如果你不得不问,你的电脑没有足够的内存。也就是说,看起来你是在创建它们但没有存储它们,所以你应该没问题。

标签: python arrays memory numpy


【解决方案1】:

几点:

  • numpy 数组在内存中的大小很容易计算。它只是元素数量乘以数据大小,加上一个小的常量开销。例如,如果您的 cube.dtypeint64,并且它有 1,000,000 个元素,则它将需要 1000000 * 64 / 8 = 8,000,000 字节 (8Mb)。
  • 但是,正如 @Gabe 所指出的,100 * 100 * 1,000,000 次双打大约需要 80 Gb
  • 这本身不会导致任何“中断”,但由于您的计算机需要执行所有swapping,因此操作会非常缓慢。
  • 您的循环不会按照您的预期进行。 element = matrix 不会替换cube 中的元素,而是简单地覆盖element 变量,而cube 保持不变。 entry = random.rand() * 100 也是如此。
  • 请参阅:http://docs.scipy.org/doc/numpy/reference/arrays.nditer.html#modifying-array-values

【讨论】:

  • 如果超过可用虚拟内存的总量,事情确实会“崩溃”,在这种情况下似乎很有可能,因为没有多少人拥有 >80GB 的交换空间
  • 在处理np.zeros()等函数时,情况并非完全如此。使用延迟加载(至少在 Linux 版本中),这将避免在访问某些元素之前使用大量内存。比如你可以用np.zeros((24000,24000))做一个矩阵,它不会占用太多内存,但是如果你用np.random.random((24000,24000)),它会占用4 GB多一点。更好的解释:stackoverflow.com/questions/27574881/…
【解决方案2】:

对于函数的“内部”部分,请查看 numpy.random 模块

import numpy as np
matrix = np.random.random((100,100))*100

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-13
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    • 2015-12-16
    • 1970-01-01
    • 1970-01-01
    • 2013-09-04
    相关资源
    最近更新 更多