【问题标题】:Numpy array memory issueNumpy数组内存问题
【发布时间】:2010-02-26 23:29:28
【问题描述】:

我相信我在使用 numpy 数组时遇到了内存问题。以下代码连续运行数小时:

    new_data = npy.array([new_x, new_y1, new_y2, new_y3])
    private.data = npy.row_stack([private.data, new_data])

其中 new_x、new_y1、new_y2、new_y3 是浮点数。

每秒记录此数据大约 5 小时(超过 72000 个浮点数)后,程序变得无响应。我认为正在发生的是某种重新分配和复制操作淹没了这个过程。有谁知道这是怎么回事?

我需要一种方法来记录这些数据,而不会遇到这个减速问题。甚至无法预先知道该数组的大小。它不一定需要使用 numpy 数组,但它需要类似的东西。有谁知道好的方法吗?

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:

    使用 Python 列表。说真的,它们的生长效率要高得多。这就是它们的设计目的。它们在这种情况下非常高效。

    如果您需要在最后(甚至偶尔在此计算过程中)从它们中创建一个数组,那么首先在列表中累积会更有效。

    【讨论】:

      【解决方案2】:

      更新:我将@EOL 出色的索引建议纳入答案。

      问题可能是row_stack 扩展目的地的方式。您最好自己处理重新分配。下面的代码分配一个大的空数组,填充它,并随着它一次填充一个小时而增长它

      numcols = 4
      growsize = 60*60 #60 samples/min * 60 min/hour
      numrows = 3*growsize #3 hours, to start with
      private.data = npy.zeros([numrows, numcols]) #alloc one big memory block
      rowctr = 0
      while (recording):
          private.data[rowctr] = npy.array([new_x, new_y1, new_y2, new_y3])
          rowctr += 1
          if (rowctr == numrows): #full, grow by another hour's worth of data
              private.data = npy.row_stack([private.data, npy.zeros([growsize, numcols])])
              numrows += growsize
      

      这应该可以防止内存管理器过度颠簸。我在每次迭代中都尝试了这个与 row_stack 相比,它的运行速度快了几个数量级。

      【讨论】:

      • 好主意。 npy.empty 似乎比 npy.zeros 更合适(而且可能快一点)。
      • 这真的很快。用 row_stack 方法将它封装在一个类中会很好。
      • 请注意,private.data[rowctr] = …[rowctr, :] 快得多。
      • @EOL - 感谢您的建议!我没有意识到你可以一次索引整行。而且速度要快得多。
      • @EOL - 在我的测试中,看起来npy.zerosnpy.empty 快一点(~3%),所以我切换回了前者。但是您建议的索引更改使速度提高了 20%。
      猜你喜欢
      • 1970-01-01
      • 2014-08-16
      • 2022-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-29
      • 1970-01-01
      • 2011-03-04
      相关资源
      最近更新 更多