我現在面臨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()
我猜想,對內存沒有任何影響,但是您是否嘗試過'df = None'而不是'del df'? – Alperen
是的,我也試過,但效果相同 – bracana
你怎麼知道它是熊貓?我傾向於認爲它是db_controller不釋放內存,但是你沒有提供任何有關db_controller的信息,所以很難說。 db_controller必須是某個東西的實例,但是什麼? – JohnE