所以我有一张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
答案 0 :(得分:1)
8 mil行x 146列(假设一列存储至少一个字节)将至少为您提供1 GB。考虑到你的列可能每列存储超过一个字节,即使你在尝试的第一步成功,你也会遇到RAM约束(例如最终结果不适合RAM)。
处理大型数据集的常用策略是小批量处理它们,然后(如果需要)合并结果。例如,看看PySpark。