【问题标题】:Postgres - out of memory on looping insertPostgres - 循环插入时内存不足
【发布时间】:2010-10-10 02:31:08
【问题描述】:

我正在解析一个包含几千个元素的 XML 文件,以便插入到 sql 数据库中。 sqlite 一切正常,但 postgres 因这个错误而死在我身上:

PGError: ERROR:  out of shared memory

我正在监视锁,看起来每个插入语句都有一个锁,虽然我只是循环调用 activerecord“保存”调用(每个调用都应该有一个事务),但这些锁似乎一直存在,所以我一次打开几千个。

作为一个实验,我将保存调用封装在一个事务中:

Coupon.connection.transaction do  
  @coupon.save!
end

这似乎解决了我的锁定问题。但是,这里似乎确实有问题。有谁知道它可能是什么?我正在使用“pg”驱动程序。

谢谢, 汤姆

【问题讨论】:

  • 您是否考虑过使用 Kettle 来完成这项任务? kettle.pentaho.com
  • 你有 SQL Rails 生成的日志吗?

标签: ruby-on-rails postgresql activerecord


【解决方案1】:

您的服务器可能只是设置为仅使用少量共享内存 - http://www.postgresql.org/docs/8.1/static/kernel-resources.html 非常详细地详细说明了所有这些内容。尝试提高初学者。不过,几千个元素打败了 PostgreSQL 听起来确实很奇怪——你存储的对象有多大?你的 AR 代码是什么样的?这里没有太多信息可以继续。

【讨论】:

  • 元素相当小……大约有 20 个属性,其中只有一个是文本数据类型。我的 AR 代码也很简单,但我不确定您在寻找什么。创建一张优惠券,分配一些属性,保存。我有一些验证器,并且没有之前/之后的保存回调。我同意你的看法,很奇怪的是,postgres 的库存安装需要对 sqlite 处理不费吹灰之力的东西进行任何可伸缩性调整。另外,我的代码非常简单。所以,这就是为什么我认为这里有一些 AR/Rails/Driver-y 发生。
猜你喜欢
  • 2019-04-10
  • 2012-02-06
  • 1970-01-01
  • 2011-01-22
  • 2012-04-12
  • 2016-01-01
  • 1970-01-01
  • 2010-12-26
  • 2019-05-27
相关资源
最近更新 更多