2

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

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

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

for row in results: 
    # blah

我不确定,但我想这getresult()会拉低整个结果集。是这样吗?pg我想有一种方法可以根据需要仅通过网络提取结果集的块,但我没有立即在模块文档中看到类似的内容。

pgdb是否可以使用模块或其他方法来做到这一点?

我关心的是应用程序机器上的内存——如果可以的话,我宁愿不要一次将数百万行加载到内存中。

这还值得担心吗?

4

4 回答 4

3

如果它遵循Python Database API 规范,您可以使用游标:

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

然后使用curs.fetchone()curs.fetchmany(chunksize)

于 2011-09-19T20:47:43.727 回答
2

pgdb的游标是迭代器

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

for row in cursor:
   # do something with row

从哪里conn创建pgdb.connect(...)

于 2011-09-19T20:40:44.660 回答
0

我不确定getresult()行为如何,但另一种选择是PL/Python

PL/Python 过程语言允许用 Python 语言编写 PostgreSQL 函数。

这将让您在数据库中直接工作。这可能不适合您需要做的事情,但值得一看。

于 2011-09-19T20:37:39.617 回答
0

使用 cursor.fetchmany() 并确保显式设置 arraysize 来处理行集,从而在性能和内存利用率之间实现所需的平衡。

我有用 cx_Oracle(它也使用 DB-API 规范)编写的作业,并使用它在网络上以 20,000 条记录为单位移动具有数十亿行的表。这需要一段时间,但我不会在源端或目标端耗尽我的服务器内存。

于 2011-09-26T16:56:23.103 回答