Python 数据帧内存问题
我无法理解为什么熊猫数据帧不能正确地从内存中清除。我是在我的机器达到16Gb内存时发现这一点的,当时它应该保持在400MB左右。我创建一个数据帧,然后在同一个函数中创建一个副本。此函数被计算多次。在下面的示例中,每次评估函数时,内存都会增加-337 Mb:Python 数据帧内存问题,python,pandas,Python,Pandas,我无法理解为什么熊猫数据帧不能正确地从内存中清除。我是在我的机器达到16Gb内存时发现这一点的,当时它应该保持在400MB左右。我创建一个数据帧,然后在同一个函数中创建一个副本。此函数被计算多次。在下面的示例中,每次评估函数时,内存都会增加-337 Mb: import pandas as pd import numpy as np from memory_profiler import profile @profile def loop_df(): for _ in xrange(1
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()
有各种各样的线程涉及到这一点,但没有一个像样的解决方案:
欢迎就如何避免这种情况提出任何建议。到目前为止,使用垃圾收集器在这个简单的示例中仍然有效,但在我的复杂代码中失败了。使用多处理池也可以处理我的复杂代码。不过,最好有一个不需要使用多处理模型的解决方案
有人能解释为什么当诸如Numpy数组和列表之类的Python对象没有导致这种行为时会发生这种情况吗?这是错误还是数据框对象的预期行为 使用
del
然后使用gc.collect()
似乎可以达到以下目的:
import pandas as pd
import numpy as np
import gc
from memory_profiler import profile
@profile
def loop_df():
for _ in xrange(100):
copy_df()
# Create a df and then copy it
@profile
def copy_df():
X = pd.DataFrame(np.random.rand(100000,10))
X2 = X.loc[0:1000,:]
del X, X2
gc.collect()
loop_df()
然后,如果您的内存仍然不足,下面是一个使用numpy memmap(内存映射)数据结构的可能解决方案:
import pandas as pd
import numpy as np
from memory_profiler import profile
import gc
@profile
def loop_df():
for _ in xrange(100):
copy_df()
@profile
def copy_df():
mmap = np.memmap('mymemmap', dtype='float64', mode='w+', shape=(100000,10))
mmap[:] = np.random.rand(100000,10)
df = pd.DataFrame(mmap)
df2 = df.loc[0:1000,:]
del df, df2, mmap
gc.collect()
pass
if __name__ == '__main__':
loop_df()
内存映射文件用于访问磁盘上大文件的小段,而无需将整个文件读入内存
很抱歉,我无法解释为什么您的示例代码尚未释放熊猫数据。我怀疑这与numpy和pandas使用本机数组或其他东西有关