django.db.utils.DatabaseError:超出共享内存

时间:2013-07-15 11:23:42

标签: django debugging postgresql django-orm

我写了一个脚本,使用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()

两个问题:

  1. 更新数据库索引是否可能导致此错误?
  2. 如果是这种情况,我该如何调试?

1 个答案:

答案 0 :(得分:3)

我有一个快速的谷歌,有几个资源要看:

  1. postgresql: out of shared memory?
  2. http://www.databasesoup.com/2012/06/postgresqlconf-maxlockspertransaction.html
  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的默认安装,那么您应该检查所有其他默认值,因为在某些情况下,默认值可能设置得太低。