2013-03-01 12 views

回答

1

我只是用pg_bulkload代替。它爲你做到了,而且更多。

+0

謝謝您的回答,但是,我知道,'pg_bulkload'做到這一點,但我要求的'GNU Parallel' +'GNU Sql' +'PostgreSQL中copy'爲例... – nanounanue 2013-03-05 01:27:46

+0

@nanounanue啊,好的;很多詢問批量加載問題的人都不知道它,並傾向於指定其他候選工具。因爲你沒有提到看過替代品,所以你的問題並不清楚,這不是這種情況。對於那個很抱歉。 – 2013-03-05 01:58:55

1

GNU parallel和pg_bulkload都很酷,但在大多數默認安裝中都不可用。我認爲這個任務可以通過在shell腳本中使用'&'(後臺子shell)和'wait'來實現,該腳本同時調用多個\ COPY操作。這裏有一個例子:

#!/bin/bash 

PG_USER_NAME=bizusr 
PG_DB_NAME=bizdb 
BCP_DIR=/data/biz/bcp/input 

do_bcp() 
{ 
    TABLE_NAME=$1 
    echo "`date` $$ copy $TABLE_NAME begin" 
    psql -q -U $PG_USER_NAME -d $PG_DB_NAME << EOF 
-- SET DATESTYLE TO 'ISO,YMD'; -- you may need this when dealing with timestamps 
\COPY $TABLE_NAME FROM '${BCP_DIR}/${TABLE_NAME}.bcp' WITH (FORMAT CSV, DELIMITER '|'); 
EOF 
    echo "`date` $$ copy $TABLE_NAME done" 
} 

echo "`date` $$ parallel copy started" 
for BCP_FILE in `ls ${BCP_DIR}/*.bcp`; do 
    TABLE_NAME=`echo $BCP_FILE|awk -F"/" '{print $NF}'|sed -e s/\.bcp$//` 
    do_bcp $TABLE_NAME & 
done 

wait 
echo "`date` $$ parallel copy finished"