1

我正在编写从数据库(单表)查询结果的小程序。我正在使用 python 3.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

变量“结果”将包含几千行,数据处理需要一些时间。这就是为什么我引入了简单的进度条来说明需要多长时间。问题是,总时间的 30% 用于查询数据库(第一行)。所以当我开始程序时,我的进度条开始移动之前会有很大的延迟。此外,我不需要将所有结果都保存在内存中。我可以分别处理它们。

有什么方法可以修改上面的程序以逐一获取行,直到收到所有行,而不将所有内容加载到内存中?另外我想监控查询和处理数据的进度。

4

1 回答 1

3

您只需在调用的情况下循环查询.all()然后调用.yield_per()以设置批处理大小:

for row in db_session.query(Data).yield_per(10):
    do_something_with_data(row)

.all()确实首先将整个结果集转换为列表,如果结果集很大,则会导致延迟。如果数据库 API 支持,则在设置后直接迭代查询,.yield_per()而是根据需要获取结果。

如果您想预先知道将返回多少行,.count()请先调用:

result = db_session.query(Data)
count = result.count()

for row in result.yield_per(10):
    update_progress_bar(progress, count)
    do_something_with_data(row)
    progress += 1

.count()要求数据库首先给我们一个项目计数。

即使使用. _ .yield_per()在这种情况下,您需要使用窗口查询根据其中一列中的值范围将查询分解为块。这是否有效取决于您的确切表格布局。

于 2013-04-11T12:08:41.643 回答