Django ORM を使用して、いくつかのオブジェクトを Django データベースにロードするスクリプトを作成しました。基盤となるデータベースは Postgres です。
しばらく問題なく実行した後、スクリプトは次のエラーで失敗します。
django.db.utils.DatabaseError: out of shared memory
HINT: You might need to increase max_locks_per_transaction.
これは、データベースの設定ではなく、スクリプトの効率の問題だと思います。
スクリプトは CSV ファイルを反復処理し、CSV ファイルのすべての行に対してデータベース オブジェクトを作成します。通常、作成するオブジェクトは数千あります。Django のデータベース効率に関する背景資料を読みました。いくつかの間違いを除外できます。クエリセットを反復処理したり、__in
クエリまたはを使用したりしていませんOFFSET
。
しかし、データベースのフィールドにはかなりの数のインデックスがあり、オブジェクトを作成して保存するたびに、Django はすべてのインデックスを更新する必要があると思います。StoreItem
たとえば、フィールドに 6 つのインデックスがあります。
for item in csv_rows:
s, created = StoreItem.objects.get_or_create(display_url=item['display_url'], \
retailer_img_url=item['retailer_img_url'],store=store_obj)
s.name = item['name']
s.description = item['description']
s.affiliate = item['affiliate']
... more stuff
s.save()
2 つの質問:
- データベースのインデックスを更新すると、このエラーが発生する可能性はありますか?
- この場合、どうすればデバッグできますか?