2017-08-07 9 views
1

を削除します。私はtest.sql内gnu平行パイプsedはバックティックシンボル

cat test.sql 
INSERT INTO `t_zydx` VALUES 77.2148, 

を持っていると私はそれがうまく

sed s/\`//g test.sql 
INSERT INTO t_zydx VALUES 77.2148, 

が、私は

cat test.sql | parallel --pipe sed s/\`//g 

並列パイプを使用して動作しますsedを使用して `

を空に置き換えたいですそれは

を示します

cat test.sql | parallel -q --pipe sed s/\`//g 

か:あなたは、コマンドを引用する必要がある210

/bin/bash: -c: line 0: unexpected EOF while looking for matching ``' 
/bin/bash: -c: line 1: syntax error: unexpected end of file 
+1

あなたは何をしようとしていますか?構文エラーの他に、解決したい問題が表示されない – hek2mgl

+0

'parallel-pipe sed'を使って' backtick'シンボルを削除しようとしていますが、動作していません。 –

+0

なぜ並列それは? – hek2mgl

答えて

2

私は20ギガバイトのようなSQLファイルを持っている場合例えば

cat test.sql | parallel --pipe sed 's/\`//g' 

は、ちょうどsedを使用するよりも、並列プロセスは速くありません?

おそらくそうではありません。 --pipeが遅いです。それは約500 MB/sで最大になります。しかし、--pipepartは約1GB/sで最大値になりますコアあたり。したがって、ハイパースレッディング(8 "コア")のある4コアでは、5 GB/sを得ることができます。

これは、コアの数でtest.sqlのサイズを分割し、そしてsedにそのサイズのフルラインチャンクを通過する。

parallel --pipepart --block -1 -a test.sql sed 's/\`//g' 

GNU平行なディスク上の出力をバッファリングし、これは今制限することができます因子。これが起こる多かれ少なかれです:

read test.sql 
save processed output to /tmp 
read processed output from /tmp 
print to stdout 

あなたは順序を気にしない場合 - あなただけのフルラインをしたい、あなたは(バージョン20170822から)--line-bufferを使用して真ん中の2つのsavereadを避けることができます。

# Chop input into one chunk per core 
# process chunk 
parallel --pipepart --block -1 -a test.sql --line-buffer sed 's/\`//g' 

このようにして、20 GBの一時的な記憶域を避けることができますが、ディスクから一度に20 GBだけを読み込み、標準出力に20 GBを書き込みます。

+0

ありがとう、それはとてもうまくいきます! –

関連する問題