我正面临着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()
答案 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无关。