在我的程序中,我需要读取一个非常大的表(它超出了内存存储空间)并让我自己编写以下结构来从表中读取数据并做一些工作。虽然我知道很有可能将选择重写为迭代器样式,但它仍然具有以下基本结构:
found = True
start = 0
batch = 2500
while found:
found = False
for obj in Channel.select().limit(batch).offset(start):
found = True
# do some big work...
start += batch
我想做的是有一些东西不会携带那么多笨拙的状态变量。关于如何清理这一点困惑的想法?
仅供引用 - 我也尝试过这个,但不确定我是否更喜欢它:
@staticmethod
def qiter(q, start=0, batch=25000):
obj = True
while obj:
for obj in q.limit(batch).offset(start):
yield obj
start += batch
最佳答案
我发现的最短的事情如下:
for start in itertools.count(0, 2500):
objs = Channel.select().limit(2500).offset(start)
if not objs:
break
for obj in objs:
# do some big work...
基本上它是两件事的结合:
count
迭代器(来自标准库的 itertools 包)将批处理计数减少到最低限度,并且- 使用单独的测试和
break
语句来摆脱它。
详细说明:
count
迭代器非常简单:它产生无限系列 0, 2500, 5000, 7500, ... 。因为这个循环永远不会结束,所以我们需要在某个地方break
。这就是 if 语句发挥作用的地方。如果 objs
是一个空列表,则 break
存在于外循环。
关于python - 控制数据库查询流程的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14837977/