以下のコードを使用しているテーブル(投稿)のすべてのオブジェクトを繰り返したい:
posts = Post.objects.all()
for post in posts:
process_post(post)
process_post
はバックグラウンドで実行され、投稿が更新されないセロリタスクですが、私が抱えている問題は、投稿テーブルに100万レコードがあることです。これは、1回限りのジョブではありません。毎日実行しています。
for post in posts
上記の行では、クエリが呼び出され、DBからすべてのデータを一度にフェッチします。
どうすればパフォーマンスを向上させることができますか?データをバッチでフェッチする方法はありますか?
あなた自身を作りなさいiterator
。たとえば、1 million
レコードと言います。
count = Post.objects.all().count() #1 million
chunk_size = 1000
for i in range(0, count, chunk_size):
posts = Post.objects.all()[i:i+chunk_size]
for post in posts:
process_post(post)
クエリセットでのスライスはLIMIT
、OFFSET
使用法を再生します。クエリは増加するごとに減少する可能性がchunk_size
ありますが、メモリ使用量も増加します。ユースケースに合わせて最適化します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加