我编写了一个脚本来使用 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
例如,我在字段上有六个索引。
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()
两个问题:
- 更新数据库索引是否可能导致此错误?
- 如果是这种情况,我该如何调试?