【问题标题】:Numpy memory error creating huge matrixNumpy 内存错误创建巨大的矩阵
【发布时间】:2013-10-05 18:32:49
【问题描述】:

我正在使用 numpy 并尝试创建一个巨大的矩阵。 执行此操作时,我收到内存错误

因为矩阵并不重要,我将只展示如何轻松重现错误的方法。

a = 10000000000
data = np.array([float('nan')] * a)

毫不奇怪,这让我很震惊MemoryError

我想说两件事:

  1. 我真的需要创建和使用一个大矩阵
  2. 我认为我有足够的 RAM 来处理这个矩阵(我有 24 Gb 或 RAM)

有没有一种简单的方法可以在 numpy 中处理大矩阵?

为了安全起见,我之前读过这些帖子(听起来很相似):

Very large matrices using Python and NumPy

Python/Numpy MemoryError

Processing a very very big data set in python - memory error

附注显然我对数字的乘法和除法有一些问题,这让我觉得我有足够的内存。所以我想是时候睡觉了,复习数学,也许是买点内存的时候了。

可能在这段时间里,一些天才可能会想出如何仅使用 24 Gb 的 RAM 来实际创建此矩阵的想法。

为什么我需要这个大矩阵 我不会对这个矩阵做任何操作。我需要做的就是将它保存到pytables

【问题讨论】:

  • 您希望如何在 24 GB 中容纳 100 亿个浮点数?如果浮点数是 2.4 字节,并且 100% 的 RAM 用于保存这个数组 - 当然 ;-)
  • 你需要用这个矩阵做什么?这可能会提供解决方法的见解。
  • 不能一块一块地保存吗? n 在您的数据分区上工作?
  • 另外,您创建它的方式首先会创建一个该大小的 python 列表。现在浮点数始终是同一个对象,但列表本身将具有与结果数组相同的大小(指针为 8 个字节,双精度为 8 个字节)。所以使用np.empty 加上np.fill 来创建数组,尤其是在内存紧张的情况下。
  • (虽然这个数组很大,但你可能不应该直接将它加载到 RAM 中,而是使用 hdf5 或内存映射或......)

标签: python memory numpy


【解决方案1】:

假设每个浮点数是 4 个字节,你会有

(10000000000 * 4) /(2**30.0) = 37.25290298461914

或者您需要在内存中存储 37.5 GB。所以我认为 24​​gb 的 RAM 是不够的。

【讨论】:

    【解决方案2】:

    如果您负担不起创建这样的矩阵,但仍希望进行一些计算,请尝试sparse matrices

    如果您希望将它传递给另一个使用鸭子类型的 Python 包,您可以使用 __getitem__ 创建自己的类来实现虚拟访问。

    【讨论】:

      【解决方案3】:

      如果你使用 python 的 pycharm 编辑器,你可以更改内存设置

      C:\Program Files\JetBrains\PyCharm 2018.2.4\bin\pycharm64.exe.vmoptions

      您可以从此文件降低 pycharm 速度,以便您的程序内存分配更多兆位 您必须编辑此代码

      -Xms1024m
      -Xmx2048m
      -XX:ReservedCodeCacheSize=960m
      

      所以你可以让它们 -Xms512m -Xmx1024m 最后你的程序就可以工作了 但是会影响pycharm中的调试性能。

      【讨论】:

      • 我不认为java内存设置会影响python内存使用。
      猜你喜欢
      • 1970-01-01
      • 2019-07-23
      • 2022-01-04
      • 2013-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-13
      相关资源
      最近更新 更多