【问题标题】:Psycopg - Memory error when selecting a large dataset from PostgreSQLPsycopg - 从 PostgreSQL 中选择大型数据集时出现内存错误
【发布时间】:2017-05-12 14:46:52
【问题描述】:

所以我有一个有 146 列的表格,大约有 146 列。 8 百万行稀疏数据本地存储到 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

【问题讨论】:

  • 解决问题的一种方法可能是将整个日期表复制到列式数据库(例如 MonetDB)中,并在 python 中执行分析,包括查询中的代码。 MonetDB 允许您将 python 代码嵌入到查询中。这是一个内置功能。这是一个示例参考:monetdb.org/blog/voter-classification-using-monetdbpython。希望这对您有用。
  • 好的,谢谢!如果没有找到 Postgres 的任何解决方案,我会试一试

标签: python postgresql psycopg2


【解决方案1】:

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

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

【讨论】:

  • 是的,数据大约 3.5 GB。假设我想多次使用 fetchmany() 将数据处理成小批量,我该如何滚动结果?
猜你喜欢
  • 2019-11-10
  • 2012-07-05
  • 2019-09-28
  • 2018-09-15
  • 2022-06-25
  • 2018-02-03
  • 2011-12-08
  • 2018-08-15
  • 1970-01-01
相关资源
最近更新 更多