【发布时间】:2018-03-01 11:23:05
【问题描述】:
我正面临 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()
【问题讨论】:
-
我猜,对内存没有影响,但你试过
df = None而不是del df吗? -
是的,我也试过了,效果一样
-
你怎么知道是熊猫?我倾向于认为是 db_controller 没有释放内存,但是您没有提供有关 db_controller 的任何信息,所以很难说。 db_controller 必须是某个东西的实例,但是什么?
-
感谢@JohnE 的帮助,我已经删除了对 db_controller 的调用,看看我修改了什么。结果还是一样...
标签: python pandas memory-leaks out-of-memory