【发布时间】:2017-06-08 05:07:02
【问题描述】:
我无法理解为什么 Pandas 数据帧没有从内存中正确清除。我在机器达到 16Gb 的内存后发现了这一点,而它本应保持在 400 Mb 左右。我创建了一个 DataFrame,然后在同一个函数中创建了一个副本。这个函数被评估了很多次。每次评估函数时,内存都会增加 - 在下面的示例中为 337 Mb:
import pandas as pd
import numpy as np
from memory_profiler import profile
@profile
def loop_df():
for _ in xrange(100):
copy_df()
# Create a df and then copy it
def copy_df():
X = pd.DataFrame(np.random.rand(100000,10))
X2 = X.loc[0:1000,:]
return
loop_df()
# Returns the following memory usage:
#Line # Mem usage Increment Line Contents
#================================================
# 13 100.3 MiB 0.0 MiB @profile
# 14 def loop_df():
# 15 437.8 MiB 337.5 MiB for _ in xrange(100):
# 16 437.8 MiB 0.0 MiB copy_df()
有各种线程涉及此问题,但没有一个像样的解决方案:Memory leak using pandas dataframe、https://github.com/pandas-dev/pandas/issues/6046、https://github.com/pandas-dev/pandas/issues/2659、Pandas: where's the memory leak here?
欢迎任何关于如何避免这种情况的建议。到目前为止,使用垃圾收集器处理了简单的示例,但在我的复杂代码中失败了。使用多处理池也适用于我的复杂代码。但是,最好有一个不需要使用多处理模型的解决方案。
谁能解释为什么当 Python 对象(如 Numpy 数组和列表)不会导致这种行为时会发生这种情况?这是一个错误还是 DataFrame 对象的预期行为?
【问题讨论】: