我正在编写一个小程序,从数据库(单表)查询结果。我使用的是python3.3、sqlalchemy和postgres数据库。在
result = db_session.query(Data).all()
progress = 0
for row in result:
update_progress_bar(progress, len(result))
do_something_with_data(row)
progress += 1
“result”变量将包含几千行,数据处理需要一些时间。这就是为什么我引入了简单的进度条来告诉你它需要多少时间。 问题是,30%的时间都在数据库(第一行)上。所以当我启动程序时,进度条开始移动之前会有很大的延迟。另外,我不需要把所有的结果都保存在内存中。我可以分开处理。在
有没有什么方法可以修改上面的程序,一行一行地得到,直到所有的行都被接收到,而不把所有的东西都加载到内存中?此外,我还想监视查询和处理数据的进度。在
您只需循环查询而不调用} 来设置批大小:
.all()
、和call^{.all()
确实会首先将整个结果集转换为一个列表,如果结果集很大,则会导致延迟。在设置.yield_per()
之后直接迭代查询,而不是根据需要获取结果,前提是数据库API支持它。在如果您想预先知道将返回多少行,请首先调用
^{pr2}$.count()
:.count()
请求数据库首先为我们提供一个项目计数。在即使使用
.yield_per()
,您的数据库仍可能预缓存结果行,从而导致启动延迟。在这种情况下,您需要使用windowed query根据列中的一个中的值范围将查询拆分为块。这是否有效取决于你确切的表格布局。在相关问题 更多 >
编程相关推荐