使用Python/PyGreSQL,如何高效处理大结果集?

2 投票
4 回答
2304 浏览
提问于 2025-04-17 02:37

我有一个查询结果,大约有900万行。

我需要对每一行进行一些处理,目前的代码是这样的:

query = conn.query(sql)
results = query.getresult()

for row in results: 
    # blah

我不太确定,但我想getresult()可能是把整个结果集都拉下来了。是这样吗?我想应该有办法只按需拉取结果集的一部分,但我在pg模块的文档中没有立即看到类似的内容。

有没有可能用pgdb模块或者其他方法来实现这个呢?

我担心的是应用程序机器的内存——如果可以的话,我不想一次性把几百万行都加载到内存里。

这值得担心吗?

4 个回答

0

我不太确定 getresult() 是怎么工作的,但还有一个选择是 PL/Python

PL/Python 是一种过程语言,允许你用 Python 语言编写 PostgreSQL 的函数。

这样你就可以直接在数据库里工作了。虽然这可能不适合你要做的事情,但值得一试。

2

pgdb的游标就像是迭代器

cursor = conn.cursor()
cursor.execute(sql)

for row in cursor:
   # do something with row

这里的 conn 是通过 pgdb.connect(...) 创建的

3

如果它遵循了Python数据库API规范,你可以使用一个游标:

curs = conn.cursor()
curs.execute('select * from bigtable')

然后可以使用 curs.fetchone() 或者 curs.fetchmany(chunksize) 来获取数据。

撰写回答