熊猫可扩展数据结构 - 最小化内存消耗


对于

你们中的许多人来说,这似乎是一个重复的问题,但我找不到一个令人满意的答案。

有一个时间序列数据对象,我每 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

最新更新