循环 pandas GroupBy 函数的奇怪内存使用

Weird memory usage of looped pandas GroupBy function

我已经处理这个问题几个小时了,但找不到解决方案。我是 运行 一个循环,在一个比较大的 DataFrame 上做一些计算。但是随着每个循环,虚拟内存使用量都会增加,直到我 运行 内存不足。我尝试手动垃圾收集,设置 gc 和库(如 pympler 和 objgraph)的默认阈值来查找此行为的原因,但没有成功。

我创建了一个最小的代码示例,它在几秒钟内用完了 8gb 的 RAM 和 ~7gb 的分页文件在几次迭代中:

import pandas as pd
import numpy as np
import time
import psutil
import os


def some_operations(data):
    data1 = data.groupby(0)[2].shift(-5).rolling(window=5, min_periods=1).max()
    data1 = data.groupby(0)[2].shift(-5).rolling(window=5, min_periods=1).max()
    data1 = data.groupby(0)[2].shift(-5).rolling(window=5, min_periods=1).max()
    data1 = data.groupby(0)[2].shift(-5).rolling(window=5, min_periods=1).max()
    data1 = data.groupby(0)[2].shift(-5).rolling(window=5, min_periods=1).max()
    return data1


if __name__=="__main__":
    data = pd.DataFrame(np.random.random((7000000, 13)))
    data[0] = data[0] > 0.5
    for j in range(500):
        tack = time.time()
        very_important_variable = some_operations(data)
        p = psutil.Process(os.getpid())
        memory_use = p.memory_info().vms / 1024 ** 2
        tick = time.time()
        print(f"Iteration: {j}, took {tick - tack:.2f} seconds and {memory_use/1000:.2f} GB of memory")

知道为什么会这样吗?内存信息告诉我,每个循环都有 ~540MB 添加到虚拟内存。

非常感谢!

更新:

似乎 Python 没有正确解除分配 some_operations 处的 groupby 操作。即使我 del datagc.collect() 在函数内部,它也不会改变任何东西。通过分配简单变量而不是 groupby 函数发现了这一点。

我怎样才能真正强制 Python 之后释放内存? del 和 gc.collect() 似乎不起作用。

仍在积累记忆:

def some_operations(data):
    data1 = data.groupby(0)[2].shift(-5).rolling(window=5, min_periods=1).max()
    data2 = data.groupby(0)[2].shift(-5).rolling(window=5, min_periods=1).max()
    data3 = data.groupby(0)[2].shift(-5).rolling(window=5, min_periods=1).max()
    data4 = data.groupby(0)[2].shift(-5).rolling(window=5, min_periods=1).max()
    data5 = data.groupby(0)[2].shift(-5).rolling(window=5, min_periods=1).max()
    result = data1 + data2 + data3 + data4 + data5
    del data1, data2, data3, data4, data5
    gc.collect()
    return result

使用最新的 Pandas 版本解决了这个问题。它甚至将内存分配减半!