繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM