使用 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 = Trueconn.execution_options(stream_results = True) 作为数据库驱动 否则将在本地获取所有结果,然后将它们流式传输到 大块的python

【讨论】:

根据具体设置,OP 可能还需要使用conn.dialect.server_side_cursors = Trueconn.execution_options(stream_results = True),否则数据库驱动程序将在本地获取所有结果,然后将它们分块流式传输到python @jeremycg,好点子 - 谢谢!我会将您的评论添加到答案中...

以上是关于使用 Pandas 在 Python 中处理大型 SQL 查询?的主要内容,如果未能解决你的问题,请参考以下文章

Python 中处理大型数据工具(dask)

读取大型 csv 文件、python、pandas 的随机行

在 Pandas 中处理大型数据透视表

text [处理大型数据集]使用chunksizes控制大型数据集(无内存错误)#pandas

使用pandas处理大型CSV文件

Python multiprocess.Pool.map 无法处理大型数组。