【发布时间】:2013-07-13 06:01:04
【问题描述】:
我编写了一个脚本来使用 Django ORM 将一些对象加载到 Django 数据库中。底层数据库是 Postgres。
愉快地运行了一段时间后,脚本失败并出现这个错误:
django.db.utils.DatabaseError: out of shared memory
HINT: You might need to increase max_locks_per_transaction.
我猜这是我的脚本效率的问题,而不是数据库设置的问题。
脚本遍历 CSV 文件,并为 CSV 文件中的每一行创建一个数据库对象。通常有几千个对象要创建。我读过some background material on database efficiency in 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()
两个问题:
- 更新数据库索引是否可能导致此错误?
- 如果是这种情况,我该如何调试?
【问题讨论】:
-
我们在这里讨论的 CSV 中有多少行?
-
不多。通常有几千个。
-
我认为索引可能是原因...在向我的表添加更多索引后,我刚刚遇到了这个错误...
标签: django debugging postgresql django-orm