2017-09-20 59 views
1

我現在面臨Python和大熊貓內存問題,內存消耗的Python熊貓內存泄露

的代碼非常簡單,

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

df是一個熊貓數據幀從數據庫中讀取,每次迭代增加在〜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() 
    
+0

我猜想,對內存沒有任何影響,但是您是否嘗試過'df = None'而不是'del df'? – Alperen

+0

是的,我也試過,但效果相同 – bracana

+0

你怎麼知道它是熊貓?我傾向於認爲它是db_controller不釋放內存,但是你沒有提供任何有關db_controller的信息,所以很難說。 db_controller必須是某個東西的實例,但是什麼? – JohnE

回答

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() 

因爲,多是在操作系統級別,與熊貓無關。

+0

感謝您的幫助@Alperen,我想找到一個解決方案,並不意味着讓我的應用程序多線程。 – bracana

+0

然後,我會建議您嘗試[this](https://stackoverflow.com/a/39377643/6900838)和[this](https://stackoverflow.com/a/31888262/6900838) – Alperen

+0

@ user1666191可以你只是試着告訴我它是否有效?我很好奇。 – Alperen