[英]Using GNU Parallel With Split
我正在將一個巨大的文件加載到PostgreSQL數據庫中。 為此,我首先在文件中使用split
獲取較小的文件(每個30Gb),然后使用GNU Parallel
和psql copy
每個較小的文件加載到數據庫中。
問題在於,拆分文件大約需要7個小時,然后每個內核才開始加載文件。 我需要的是一種告訴split
在每次完成文件寫入時將文件名打印到std輸出的方法,因此我可以將其管道傳輸到Parallel
並在split
完成寫入時開始加載文件。 像這樣:
split -l 50000000 2011.psv carga/2011_ | parallel ./carga_postgres.sh {}
我已經閱讀了split
手冊頁,但找不到任何內容。 有沒有辦法使用split
工具或任何其他工具來做到這一點?
您可以讓parallel進行拆分:
<2011.psv parallel --pipe -N 50000000 ./carga_postgres.sh
請注意,該手冊頁建議使用--block
over -N
,這仍將在記錄分隔符處拆分輸入,默認情況下為\\n
,例如:
<2011.psv parallel --pipe --block 250M ./carga_postgres.sh
--pipe
和-N
這是將100個數字的序列分成5個文件的測試:
seq 100 | parallel --pipe -N23 'cat > /tmp/parallel_test_{#}'
檢查結果:
wc -l /tmp/parallel_test_[1-5]
輸出:
23 /tmp/parallel_test_1
23 /tmp/parallel_test_2
23 /tmp/parallel_test_3
23 /tmp/parallel_test_4
8 /tmp/parallel_test_5
100 total
如果使用GNU split
,則可以使用--filter
選項
'--filter =命令'
使用此選項,而不是簡單地寫入每個輸出文件,而是通過管道將管道寫入每個輸出文件的指定shell命令。 命令應使用$ FILE環境變量,該變量在每次調用命令時都設置為不同的輸出文件名。
您可以創建一個shell腳本,該腳本創建一個文件並在后台的末尾啟動carga_postgres.sh
#! /bin/sh
cat >$FILE
./carga_postgres.sh $FILE &
並使用該腳本作為過濾器
split -l 50000000 --filter=./filter.sh 2011.psv
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.