使用 Pandas 在 Python 中处理大型 SQL 查询?
Posted
技术标签:
【中文标题】使用 Pandas 在 Python 中处理大型 SQL 查询?【英文标题】:Processing a large SQL query in Python using Pandas? 【发布时间】:2017-11-02 12:27:03 【问题描述】:我想使用 Python、psycopg2 和 Pandas 对将从 Postgres 数据库中提取的一些数据进行回测。
将从 Postgres 中提取的数据非常大(超过 10 Gbs)——我的系统将无法在 RAM 中保存这些数据,即使 Pandas 数据帧能够存储这么多数据。
作为概述,我希望我的 Python 程序需要执行以下操作:
1:连接到远程(基于 LAN)Postgres 数据库服务器
2:对数据库表运行基本选择查询
3:将查询结果存储在 Pandas 数据框中
4:对Pandas数据框内的数据进行计算操作
5:将这些操作的结果写回数据库中的现有表。
我预计将在第 2 步中返回的数据会非常大。
是否可以将大型查询的结果流式传输到 Pandas 数据帧,以便我的 Python 脚本可以处理更小块的数据,例如 1gb?
您可以指出的任何想法、建议或资源,关于如何最好地做到这一点,或者如果我没有以正确的方式处理这个问题,将不胜感激,我相信这对其他人会很有用前进。
谢谢。
【问题讨论】:
这取决于...你打算在 Pandas 中对这些数据进行什么样的操作?所有这些操作都可以与块一起使用吗?或者您是否需要将它们全部在 RAM 中处理(例如排序、分组等)?在这种情况下,您可以考虑使用 Dask DataFrame 甚至 Apache Spark(在集群模式下) 感谢您的评论 - 操作将计算移动平均线和其他类似的计算,所以这些可以在夹盘中完成......但我需要了解如何从数据库中获取数据块 -我希望我能找到查询和流式传输前 10000 行,对其进行处理,然后接收并处理接下来的 10000 行等等......我将查看 Dask DataFrame 和 Apache Spark - 感谢您提及它们!跨度> 【参考方案1】:演示 - 如何从 SQL DB 中分块读取数据并处理单个块:
from sqlalchemy import create_engine
# conn = create_engine('postgresql://user:password@host:port/dbname')
conn = create_engine('postgresql+psycopg2://user:password@host:port/dbname')
qry = "select * from table where ..."
sql_reader = pd.read_sql(qry, con=conn, chunksize=10**4)
for df in sql_reader:
# process `df` (chunk of 10.000 rows) here
更新: very good point from @jeremycg
根据具体设置,OP 可能还需要使用
conn.dialect.server_side_cursors = True
和conn.execution_options(stream_results = True)
作为数据库驱动 否则将在本地获取所有结果,然后将它们流式传输到 大块的python
【讨论】:
根据具体设置,OP 可能还需要使用conn.dialect.server_side_cursors = True
和conn.execution_options(stream_results = True)
,否则数据库驱动程序将在本地获取所有结果,然后将它们分块流式传输到python
@jeremycg,好点子 - 谢谢!我会将您的评论添加到答案中...以上是关于使用 Pandas 在 Python 中处理大型 SQL 查询?的主要内容,如果未能解决你的问题,请参考以下文章
读取大型 csv 文件、python、pandas 的随机行