内存消耗Python Pandas内存泄漏

时间:2017-09-20 11:54:34

标签: python pandas memory-leaks out-of-memory

我正面临着Python和Pandas的内存问题,

代码非常简单,

for i in range(5):
    df = db_controller.read_from_database(i)   
    print(df)

df是从数据库读取的pandas Dataframe,每次迭代都会在~1Gb内增加弹性内存,所有迭代都会从数据库中检索出相同的数据。在我看来,对于每次迭代,弹性内存不应该增加,因为变量df超出范围(在新的迭代中)。结果是,经过一些迭代后,弹性内存增加到12 Gb,我得到错误OutOfMemory。

我试图强制垃圾收集器:

for i in range(5):
    df = db_controller.read_from_database(i)   
    print(df)
    del df
    gc.collect()

结果是每次调用垃圾收集器时,弹性内存释放大约30Mb,但它不能释放1Gb。

有人可以帮助我?,我怎样才能在每次迭代后完全释放df DataFrame?

  • 我也尝试删除db_controller:

    from pyathenajdbc import connect
    import pandas as pd    
    
    for i in range(5):
        query = "select * from events.common_events limit 20000"
    
        conn = connect(s3_staging_dir=amazon_constants.AMAZON_S3_TABLE_STAGING_DIR,
                   region_name=amazon_constants.AMAZON_REGION)
        df = pd.DataFrame()
        try:
            df = pd.read_sql(query, conn)
        finally:
            conn.close()
    
        print(df)
        del df
        gc.collect()
    

1 个答案:

答案 0 :(得分:1)

我没试过,但这应该有效:

from multiprocessing import Pool

def read_func():
    df = db_controller.read_from_database(i) 
    print(df)  

pool = Pool()
for i in range(5):
    pool.map(read_func)
    pool.close()
    pool.join()

因为,多处理是在操作系统级别,与pandas无关。