我写了一个脚本,使用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()
两个问题:
答案 0 :(得分:3)
我有一个快速的谷歌,有几个资源要看:
此引号取自http://www.postgresql.org/docs/9.1/static/runtime-config-locks.html
max_locks_per_transaction(整数)
共享锁定表跟踪max_locks_per_transaction *(max_connections + max_prepared_transactions)对象(例如表)上的锁定; 因此,只有这么多不同的物体可以锁定在任何物体上 一度。此参数控制对象锁的平均数 为每笔交易分配;个别交易可以锁定更多 对象,只要所有事务的锁都适合锁 表。这不是可以锁定的行数;那个价值 是无限的。默认值64,历史证明是足够的,但是 如果您的客户触摸很多,您可能需要提高此值 单个事务中的不同表。此参数只能是 在服务器启动时设置。
增加此参数可能会导致PostgreSQL请求比操作系统的默认值更多的System V共享内存 配置允许。有关如何使用的信息,请参见第17.4.1节 如有必要,请调整这些参数。
运行备用服务器时,必须将此参数设置为与主服务器上相同或更高的值。否则,查询 将不允许在备用服务器中使用。
所以,看起来你应该检查max_locks_per_transaction的默认值,将其设置检查为合理的值
同样,如果您使用postgres的默认安装,那么您应该检查所有其他默认值,因为在某些情况下,默认值可能设置得太低。