[英]Using Python/PyGreSQL, how can I efficiently handle a large result set?
我有一个约900万行的查询结果集。
我需要为每一行做一些处理,并且代码当前正在执行此操作:
query = conn.query(sql)
results = query.getresult()
for row in results:
# blah
我不确定,但是我认为getresult()
会拉低整个结果集。 是这样吗 我想有一种方法可以根据需要只将结果集的一部分拉到电线上,但是我没有立即在pg
模块文档中看到类似的东西。
是否可以使用pgdb
模块或其他方法来做到这一点?
我担心的是应用程序计算机上的内存-如果可以,我不希望一次将数百万行全部加载到内存中。
这是否值得担心?
如果它遵循Python数据库API规范 ,则可以使用游标:
curs = conn.cursor()
curs.execute('select * from bigtable')
然后使用curs.fetchone()
或curs.fetchmany(chunksize)
pgdb
的游标是迭代器
cursor = conn.cursor()
cursor.execute(sql)
for row in cursor:
# do something with row
从pgdb.connect(...)
创建conn
位置
我不确定getresult()
行为如何,但另一个选择是PL / Python :
PL / Python过程语言允许PostgreSQL函数以Python语言编写。
这样一来,您就可以在数据库内部进行工作。 这可能不适合您需要执行的操作,但值得一看。
使用cursor.fetchmany()并确保您显式设置arraysize来处理行集,从而在性能和内存利用率之间达到所需的平衡。
我有用cx_Oracle(也使用DB-API规范)编写的作业,并使用它在网络中以20,000条记录的批次移动具有数十亿行的表。 这需要一段时间,但我不会在源端或目标端耗尽服务器内存。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.