使用Python/PyGreSQL,如何高效处理大结果集?
我有一个查询结果,大约有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)
来获取数据。