2012-08-09 106 views
0

我在Ubuntu Linux 11和Postgresql 9.1上。我使用CREATE TABLE。选择在DBLINK,并与约200万行的表,我得到Postgresql 9.1在创建表时出现内存不足选择

ERROR: out of memory 
DETAIL: Failed on request of size 432. 

所以我里面取整个表的内容从一个数据库,并插入(或创建它们)另一个数据库(在同一台机器上)。我正在使用Postgresql的默认值,但是我尝试了使用pgtune的值以及无效。在插入过程中,我看到内存使用量正在增加,但是在达到我的机器限制之前出现错误。的ulimit -a说

core file size   (blocks, -c) 0 
data seg size   (kbytes, -d) unlimited 
scheduling priority    (-e) 0 
file size    (blocks, -f) unlimited 
pending signals     (-i) 30865 
max locked memory  (kbytes, -l) 64 
max memory size   (kbytes, -m) unlimited 
open files      (-n) 1024 
pipe size   (512 bytes, -p) 8 
POSIX message queues  (bytes, -q) 819200 
real-time priority    (-r) 0 
stack size    (kbytes, -s) 8192 
cpu time    (seconds, -t) unlimited 
max user processes    (-u) 30865 
virtual memory   (kbytes, -v) unlimited 
file locks      (-x) unlimited 

如果我做创建表作为...在同一个数据库中选择,然后它的工作原理没有问题。有任何想法吗?

编辑:我试着调整postgresql.conf中的各种内存设置,并没有帮助。我错过了什么?

+1

您是否启用了自动提交功能?如果是,请尝试关闭它。 – 2012-08-09 06:46:10

+0

我试过它没有工作。我发现这个链接http://www.postgresql.org/docs/8.4/static/populate.html与大插入的建议 – user423805 2012-08-09 07:21:53

+1

这给了我一个想法 - 我可能会更好使用pg_dump和工作文件。 – user423805 2012-08-09 07:22:19

回答

0

我的猜测是,中间集合只能分配给内存,并且本身不能实现。您最好的选择是找到解决方法或与dblink人员一起解决此问题。一些潜在的解决方法是:

  1. 使用COPY创建csv文件并将其插入到数据库中。

  2. 将查询分块,一次写入100k行。

很明显,我的猜测是dblink通过分配结果集,分配需要的内存并将数据交给Postgresql来处理事情。有可能这样做的方式是,当请求可能无法完全在dblink模块本身的内存中进行分配时,可以通过快速代理(并通过网络连接传输)。

但是对于INSERT ... SELECT,它可能首先在内存中分配整个结果集,然后尝试处理它并将其一次插入到表中。

但是,这是一种没有详细审查代码的直觉(我打开了dblink.c并快速扫描)。你必须记住,PostgreSQL作为db客户端同时作为其他服务器的db客户端和db服务器本身,因此libpq和后端的内存陷入了一起。

编辑:经过多一点审查,看起来这是最正确的。 dblink在内部使用游标。我的猜测是,在插入之前,所有的东西都是从光标中提取出来的,所以它可以立即执行。

+0

我的直觉是,这是连接到外部数据库所需的两阶段提交的直接结果。 – wildplasser 2013-04-06 16:08:43

+0

我不这么认为。 TPC不依赖于记忆中的结果。更有可能是因为dblink将结果集中的记录保存为结果集(即一次获取它们)和内存不足而造成的。 – 2013-04-06 16:10:47

+0

增加了我认为正在发生的更长时间的解释。 – 2013-04-06 16:20:30

相关问题