【问题标题】:Memory error In instantiating the numpy array实例化numpy数组时出现内存错误
【发布时间】:2016-12-23 08:14:52
【问题描述】:

我有一个包含 50,000 个元素的列表 A,每个元素都是一个形状数组 (102400)

我尝试实例化一个数组B

     B=numpy.array(A)

但这会引发异常 MemoryError。我知道内存和大小非常巨大?但是有没有办法在 numpy 中使用 ndarrays 来避免这种 MemoryError 呢?

【问题讨论】:

  • 你有多少内存?
  • 你打算用这个大数组做什么?即使您设法创建它,您也可能无法用它做任何有意义的事情。在计算过程中numpy 会创建临时缓冲区,并且可能会在内存中留下一份或多份副本。有些东西太大了。
  • 这些元素真的是数组吗?如果是的话,dtype 是什么?或者他们也列出来了?你能用A的子集制作数组吗?
  • 可以不创建listA直接加载数据到B吗?

标签: python numpy memory


【解决方案1】:

假设它们是 int64(默认的 numpy 类型)。每个占用8个字节,则: 维度(按占用每个字节数):

50000 * 102400 * 8 = 40960000000

以千兆字节为单位

50000 * 102400 * 8 / 1024**3 = 38.14697265625 Gb

【讨论】:

  • 所以解决办法就是多买内存。 ;)
  • 也许解决方案是按块(你输入内存)来做,或者改变类型:如果你知道它们是肯定的,使用 uint。如果是,请使用 int32 或 int16。
  • 即使使用 int8 也会超过 4Gb,并且 A 本身占用了大量内存。
  • 处理大事并不容易!从 40 Gb 迁移到 4 Gb 是一件很重要的事情。如果你也为比特(例如 200 Mb)做这件事,你就解决了。
  • 我同意。我的意思是 OP 没有提供其他详细信息,唯一的建议是“购买更多内存”
【解决方案2】:

作为一种解决方法,您可以避免使用以下内容复制数组:

B = np.empty(len(A), dtype=object)
for i, a in enumerate(A):
    B[i] = a

这将允许创建 dtype object 的 ndarray,其元素将是 A 的原始元素。然后,您可以对其执行 一些 数组操作。

但我不确定你这样做有什么好处。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-12
    • 2014-08-12
    • 2011-12-20
    • 1970-01-01
    • 2017-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多