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 个回答
3
用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
的效果,发现这个方法快了好几个数量级。