我的查询结果集约为9百万行。
我需要对每一行进行一些处理,代码目前执行此操作:
query = conn.query(sql)
results = query.getresult()
for row in results:
# blah
我不确定,但我想getresult()
正在拉下整个结果集。是这样的吗?我想有一种方法可以根据需要仅在线上拉出结果集的块,但我没有立即在pg
模块文档中看到类似的内容。
是否可以使用pgdb
模块或其他方法执行此操作?
我担心的是应用程序机器上的内存 - 如果我能帮助它,我宁愿不一次将数百万行加载到内存中。
这甚至值得担心吗?
答案 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个记录的批量中通过网络移动数十亿行的表。这需要一段时间,但我不会在源端或目标端吹出我的服务器内存。