在Pandas数据框中加载巨大的表时,如何避免EC2中的内存错误?

问题描述

我试图连接到redshift并将巨大的事实表加载到如下所示的pandas数据框中, 执行脚本时总是遇到内存错误。 我在想按块部分加载是不正确的,或者根本不应该将整个事实表加载到数据帧中。有人可以指出正确的方向吗?

conn = psycopg2.connect(dbname='',user='',host='',port='',password='')
df = pd.DataFrame()

for chunk in pd.read_sql(
        "select * from MyFactTable ",con=conn,chunksize=1000):
    df = df.append(chunk)

解决方法

是的,df = df.append(chunk)部分意味着您要立即将整个表加载到内存中,因此最好不要分块。

如果可能,您需要分别处理每个块;根据您的计算,这可能很容易,也可能很困难。如果可能的话,还应该将尽可能多的处理推入SQL查询中(例如,如果只需要一些行,请使用WHERE子句)。

PS:根据表的大小以及您需要对表进行的操作,可能还可以选择具有更多内存的EC2实例。不是一个优雅的解决方案,但有时会在问题上投入资源...