python - Pandas.groupby.apply() 内存泄漏?

标签 python memory-leaks pandas

我目前正在将 Pandas 用于一个 csv 源文件约为 600mb 的项目。在分析过程中,我正在将 csv 读入数据框,在某些列上分组并将一个简单的函数应用于分组的数据框。我注意到我在这个过程中进入了交换内存,所以进行了一个基本测试:

我首先在 shell 中创建了一个相当大的数据框:

import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(3000000, 3),index=range(3000000),columns=['a', 'b', 'c'])

我定义了一个名为 do_nothing() 的毫无意义的函数:

def do_nothing(group):
    return group

然后运行以下命令:

df = df.groupby('a').apply(do_nothing)

我的系统有 16gb 的 RAM 并且正在运行 Debian (Mint)。创建数据框后,我使用了大约 600mb 的 RAM。一旦 apply 方法开始执行,该值就开始飙升。在完成命令并稳定回 5.4gb 之前,它稳步上升到大约 7gb(!)(当 shell 仍然处于事件状态时)。问题是,我的工作需要做的不仅仅是“do_nothing”方法,因此在执行真正的程序时,我限制了 16gb 的 RAM 并开始交换,使程序无法使用。这是故意的吗?我不明白为什么 Pandas 需要 7gb 的 RAM 才能有效地“无所事事”,即使它必须存储分组的对象。

关于导致此问题的原因/如何解决它的任何想法?

干杯,

.P

最佳答案

使用 0.14.1,我不认为它们是内存泄漏(框架大小的 1/3)。

In [79]: df = DataFrame(np.random.randn(100000,3))

In [77]: %memit -r 3 df.groupby(df.index).apply(lambda x: x)
maximum of 3: 1365.652344 MB per loop

In [78]: %memit -r 10 df.groupby(df.index).apply(lambda x: x)
maximum of 10: 1365.683594 MB per loop

关于如何解决此类问题的两条一般性评论:

1) 如果可能的话,使用 cython 级别的函数,会更快,并且会使用更少的内存。 IOW,使用函数分离 groupby 表达式和 void 几乎总是值得的(如果可能的话,有些东西太复杂了,但这就是重点,你想把它分解)。例如

代替:

df.groupby(...).apply(lambda x: x.sum() / x.mean())

这样做要好得多:

g = df.groupby(...)
g.sum() / g.mean()

2) 您可以通过手动进行聚合轻松地“控制”groupby(此外,如果需要,这将允许定期输出和垃圾收集)。

results = []
for i, (g, grp) in enumerate(df.groupby(....)):

    if i % 500 == 0:
        print "checkpoint: %s" % i
        gc.collect()


    results.append(func(g,grp))

# final result
pd.concate(results)

关于python - Pandas.groupby.apply() 内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25130839/

相关文章:

memory-management - 关闭内存泄漏

在 Swift 中使用 String 的 iOS 8 内存泄漏

c# - Entity Framework TypeUsage 对象

python - 在 pandas 系列中使用前一个 "row"的值

python - 如何制作一个像lisp的 'mapcar'一样工作的python函数

python - 在 python 中按字母顺序(带数字)打印列表

python - “builtin_function_or_method”对象不可下标Python中的错误

python - TensorFlow 全连接教程 : How are the trained weights used for Eval and Test?

python - Jupyter Notebook - 在函数内部绘图 - 图未绘制

python - 计算时间差,如果差值大于一个小时,标记为 'missing' ,在该区域的折线图中绘制差距