循环 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 data
和 gc.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 版本解决了这个问题。它甚至将内存分配减半!
我已经处理这个问题几个小时了,但找不到解决方案。我是 运行 一个循环,在一个比较大的 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 data
和 gc.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 版本解决了这个问题。它甚至将内存分配减半!