Django / Python / PIL /一括サムネイル生成-メモリーエラー
-
05-07-2019 - |
質問
sorl-を使用して、約4万の画像ごとに4つのサムネイルを一括生成しようとしています。 djangoアプリのサムネイル。 ImageWithThumbnailsFieldFileを使用してすべてのdjangoオブジェクトを反復処理し、そのgenerate_thumbnails()関数を呼び出します。
これは正常に機能しますが、数百回の反復の後、メモリが不足し、「メモリエラー」でループがクラッシュします。 sorl-thumbnailはPILを使用してサムを生成するため、PILはサム生成時に使用したすべてのメモリを返さないようです。
この問題を回避する方法は誰でもできます。不要になったメモリを返すようにPILを強制することにより、
私のコードは単純に次のようになります:
all = Picture.objects.all()
for i in all:
i.image.generate_thumbnails()
関数generate-thumbnailは、ここから開始します、129行目。
アドバイスをありがとう!
マーティン
解決
問題は、Djangoがクエリセットの結果をループしてキャッシュする方法に関連しています。 Djangoはすべてのオブジェクトをメモリに保持するため、同じクエリセットを繰り返し使用する場合、すべてのデータを取得するためにデータベースに再度アクセスする必要はありません。
する必要があるのは、 iterator()メソッド。だから:
all = Picture.objects.all().iterator()
for i in all:
i.image.generate_thumbnails()
所属していません StackOverflow