Python 数据帧内存问题

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

我无法理解为什么熊猫数据帧不能正确地从内存中清除。我是在我的机器达到16Gb内存时发现这一点的,当时它应该保持在400MB左右。我创建一个数据帧,然后在同一个函数中创建一个副本。此函数被计算多次。在下面的示例中,每次评估函数时,内存都会增加-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()
有各种各样的线程涉及到这一点,但没有一个像样的解决方案:

欢迎就如何避免这种情况提出任何建议。到目前为止,使用垃圾收集器在这个简单的示例中仍然有效,但在我的复杂代码中失败了。使用多处理池也可以处理我的复杂代码。不过,最好有一个不需要使用多处理模型的解决方案


有人能解释为什么当诸如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使用本机数组或其他东西有关