2012-08-09 70 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

相關問題