Psycopg - 从PostgreSQL中选择大型数据集时出现内存错误

时间:2017-05-12 04:30:36

标签: python postgresql psycopg2

所以我有一张146列的桌子。 8 mil行的稀疏数据本地存储在Postgresql中。

我的目标是一次选择整个数据集,将其存储到pandas数据框中并执行一些计算。

到目前为止,我已经阅读了许多线程中的服务器端游标,但我想我做错了,因为我没有看到内存的改善。文档也很有限..

到目前为止,我的代码如下:

cur=conn.cursor('testCursor')
cur.itersize = 100000
cur.execute("select * from events")

df = cur.fetchall()

df = pd.DataFrame(df)
conn.commit()
conn.close()

我也尝试使用fetchmany()或fetchone()而不是fetchall(),但我不知道如何滚动结果。我想我可以使用像fetchone()这样的东西,但我不知道如何处理fetchmany():

df = cur.fetchone()
while row:
   row = cur.fetchone() 

最后,在fetchone()和fetchmany()的情况下,如何在不消耗所有内存的情况下将结果连接到单个数据帧中?请注意,我有16GB的可用RAM

1 个答案:

答案 0 :(得分:1)

8 mil行x 146列(假设一列存储至少一个字节)将至少为您提供1 GB。考虑到你的列可能每列存储超过一个字节,即使你在尝试的第一步成功,你也会遇到RAM约束(例如最终结果不适合RAM)。

处理大型数据集的常用策略是小批量处理它们,然后(如果需要)合并结果。例如,看看PySpark。