2010-02-26 52 views
5

我相信我有使用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

更新:我将@ 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,它的运行速度要快几个数量级。

+0

好主意。 'npy.empty'似乎比'npy.zeros'更合适(可能更快一点)。 – EOL 2010-02-27 15:58:44

+0

这真的很快。使用row_stack方法将其封装到类中将会很好。 – EOL 2010-02-27 16:02:50

+1

请注意'private.data [rowctr] = ...'比'[rowctr,:]'快得多。 – EOL 2010-02-27 16:03:53

3

使用Python列表。说真的,他们的成长要高得多。这是他们设计的。在这种环境下它们非常有效。

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