2

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 つの質問:

  1. データベースのインデックスを更新すると、このエラーが発生する可能性はありますか?
  2. この場合、どうすればデバッグできますか?
4

1 に答える 1