我相信我使用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数组,但它需要类似的东西。有谁知道一个好方法?
答案 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
,并且运行速度提高了几个数量级。