簡體   English   中英

結合使用GNU Parallel和Split

[英]Using GNU Parallel With Split

我正在將一個巨大的文件加載到PostgreSQL數據庫中。 為此,我首先在文件中使用split獲取較小的文件(每個30Gb),然后使用GNU Parallelpsql 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM