SqlAlchemyを使用してインターフェースする最大1,000万レコードのMySQLテーブルがあります。データセットの一口サイズのチャンクをインテリジェントにフェッチする組み込みのジェネレーターを使用していると思っていたとしても、このテーブルの大きなサブセットに対するクエリはメモリを大量に消費することがわかりました。
for thing in session.query(Things):
analyze(thing)
これを回避するには、チャンクで噛み付く独自のイテレータを作成する必要があることがわかりました。
lastThingID = None
while True:
things = query.filter(Thing.id < lastThingID).limit(querySize).all()
if not rows or len(rows) == 0:
break
for thing in things:
lastThingID = row.id
analyze(thing)
これは正常ですか、それともSA組み込みジェネレーターに関して私が見逃しているものがありますか?
この質問に対する答えは、メモリ消費が予想されないことを示しているようです。