【问题标题】:django.db.utils.DatabaseError: out of shared memorydjango.db.utils.DatabaseError:共享内存不足
【发布时间】: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()

两个问题:

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

【问题讨论】:

  • 我们在这里讨论的 CSV 中有多少行?
  • 不多。通常有几千个。
  • 我认为索引可能是原因...在向我的表添加更多索引后,我刚刚遇到了这个错误...

标签: django debugging postgresql django-orm


【解决方案1】:

我用谷歌搜索了一下,有几个资源可供查看:

  1. postgresql: out of shared memory?
  2. http://www.databasesoup.com/2012/06/postgresqlconf-maxlockspertransaction.html

此引用摘自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,那么您可能应该检查所有其他默认值,因为在某些情况下默认值可能设置得太低。

【讨论】:

    猜你喜欢
    • 2011-03-09
    • 2013-05-05
    • 1970-01-01
    • 2019-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-08
    相关资源
    最近更新 更多