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

Posted

技术标签:

【中文标题】在 Pandas 数据框中加载大表时,如何避免 EC2 中的内存错误?【英文标题】:How do I avoid memory error in EC2 when loading a huge table in Pandas dataframe? 【发布时间】:2020-08-28 06:06:17 【问题描述】:

我尝试连接到 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)

【问题讨论】:

【参考方案1】:

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

如果可能的话,你需要单独处理每个chunk;根据您的计算,这可能容易或困难。如果可能,您还应该将尽可能多的处理推送到 SQL 查询中(例如,如果您只需要一些行,请使用 WHERE 子句)。

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

【讨论】:

啊,我明白了,我不应该有一个包含所有数据的数据框。相反,我应该处理数据并按块输出它们对吗? 就是这样。如果您正在计算可以逐块完成的事情,那么一切都很好;只要确保你一次只有一个内存块。

以上是关于在 Pandas 数据框中加载大表时,如何避免 EC2 中的内存错误?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 R 中加载大数据? [复制]

如何在 Qt 中从 txt 文件中加载大数据

我应该避免在查询大表时使用 ORDER BY 吗?

如何使用角度6的分页,过滤,排序功能在表组件中加载大数据

如何在 python 中加载大的 .mat 文件?

如何在 Google BigQuery 中加载大文本文件