熊猫集团通过内存释放

Ale*_*lex 19 python memory-management python-3.x pandas

问题

我注意到在迭代过程中迭代通过Pandas GroupBy对象时分配的内存不会被释放.我使用resource.getrusage(resource.RUSAGE_SELF).ru_maxrss(这篇文章的第二个答案中的详细信息)来测量Python进程使用的活动内存总量.

import resource
import gc

import pandas as pd
import numpy as np

i = np.random.choice(list(range(100)), 4000)
cols = list(range(int(2e4)))

df = pd.DataFrame(1, index=i, columns=cols)

gb = df.groupby(level=0)
# gb = list(gb)
for i in range(3):
    print(resource.getrusage(resource.RUSAGE_SELF).ru_maxrss / 1e6)
    for idx, x in enumerate(gb):
        if idx == 0:
            print(resource.getrusage(resource.RUSAGE_SELF).ru_maxrss / 1e6)
    # del idx, x
    # gc.collect()
Run Code Online (Sandbox Code Playgroud)

打印以下总活动内存(以gb为单位)

0.671732
1.297424
1.297952
1.923288
1.923288
2.548624
Run Code Online (Sandbox Code Playgroud)

解决方案

取消注释del idx, xgc.collect()修复问题.但是我必须del通过遍历groupby来引用所有引用返回的DataFrames的变量(这可能是一个痛苦,取决于内部for循环中的代码).新的印刷记忆用法变为:

0.671768
1.297412
1.297992
1.297992
1.297992
1.297992
Run Code Online (Sandbox Code Playgroud)

或者我可以取消注释gb = list(gb).由此产生的内存使用量与之前的解决方案大致相同:

1.32874
1.32874
1.32874
1.32874
1.32874
1.32874
Run Code Online (Sandbox Code Playgroud)

问题

  1. 为什么迭代完成后迭代通过组得到的DataFrames的内存没有被释放?
  2. 有没有比上面两个更好的解决方案?如果没有,这两种解决方案中的哪一种"更好"?

tmt*_*prt 1

记忆怪异

有趣!你不需要del idx, x。只有使用gc.collect()才能让我的记忆保持不变。这比del在循环内使用语句要干净得多。

  • 什么环境?在 iPython 内部?命令行?另一个完整应用程序的一部分? (3认同)