你们中的许多人来说,这似乎是一个重复的问题,但我找不到一个令人满意的答案。
我有一个时间序列数据对象,我每 200 毫秒向其附加一次最坏情况的数据。现在,这非常非常占用内存,因为我知道它必须再次重新创建底层数据结构,并且它似乎没有清理旧对象。我尝试了类似的东西
old = mydata
mydata = mydata.append(...)
del old
这根本没有任何区别!
问题是我的进程在只有 1GB 内存和这种处理的主机上工作很快耗尽主机内存。
我需要在内存中保留至少过去 30 小时的数据,因为每 200 毫秒/每个刻度执行一次分析。
任何优化记忆的建议 - 仍然保留熊猫。时间序列功能(基于时间间隔的切片)。
append
操作返回一个新的系列。因此,您每次都在复制数据,这是非常低效的(从速度和内存的角度来看)。处理此问题的常用方法是预先创建比所需更大的大小,然后简单地填写值。如果需要,定期调整大小。(这也是Python lists/dict的做法)。
我在这里举一个例子,以及一种使用HDFStore
来做到这一点的方法。
In [7]: df = DataFrame(index=range(5),columns=list('AB'))
In [8]: df.iloc[0] = Series(dict(A = 10, B = 5))
In [9]: df.iloc[1] = Series(dict(A = 11, B = 6))
In [10]: def f(x,indexer):
....: return x.iloc[0:indexer]*2
....:
In [11]: f(df,2)
Out[11]:
A B
0 20 10
1 22 12
In [12]: df.iloc[2] = Series(dict(A = 12, B = 7))
In [13]: f(df,3)
Out[13]:
A B
0 20 10
1 22 12
2 24 14