使用Python / PyGreSQL,我如何有效地处理大型结果集?

时间:2011-09-19 20:04:46

标签: python postgresql pygresql

我的查询结果集约为9百万行。

我需要对每一行进行一些处理,代码目前执行此操作:

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

for row in results: 
    # blah

我不确定,但我想getresult()正在拉下整个结果集。是这样的吗?我想有一种方法可以根据需要仅在线上拉出结果集的块,但我没有立即在pg模块文档中看到类似的内容。

是否可以使用pgdb模块或其他方法执行此操作?

我担心的是应用程序机器上的内存 - 如果我能帮助它,我宁愿不一次将数百万行加载到内存中。

这甚至值得担心吗?

4 个答案:

答案 0 :(得分:3)

如果它在Python Database API spec之后,您可以使用光标:

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

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

答案 1 :(得分:2)

pgdb的游标是迭代器

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

for row in cursor:
   # do something with row

conn

创建pgdb.connect(...)

答案 2 :(得分:0)

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

  

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

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

答案 3 :(得分:0)

使用cursor.fetchmany()并确保显式设置arraysize以处理行集,这些行为您提供性能和内存利用率之间所需的平衡。

我有用cx_Oracle(也使用DB-API规范)编写的作业,并使用它在20,000个记录的批量中通过网络移动数十亿行的表。这需要一段时间,但我不会在源端或目标端吹出我的服务器内存。