Numpy数组内存问题

时间:2010-02-26 23:29:29

标签: python arrays numpy

我相信我使用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数组,但它需要类似的东西。有谁知道一个好方法?

2 个答案:

答案 0 :(得分:3)

使用Python列表。说真的,他们的成长效率更高。这就是他们的设计目标。在这种情况下,它们非常有效。

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

答案 1 :(得分: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,并且运行速度提高了几个数量级。