私のテストでは、 sed
が示されました このようなものでは、かなり簡単に CPU バウンドになる可能性があります。マルチコア マシンを使用している場合は、複数の sed
を生成してみてください。 次のようなスクリプトで処理します:
#!/bin/sh
INFILE=data.txt
OUTFILE=fixed.txt
SEDSCRIPT=script.sed
SPLITLIMIT=`wc -l $INFILE | awk '{print $1 / 20}'`
split -d -l $SPLITLIMT $INFILE x_
for chunk in ls x_??
do
sed -f $SEDSCRIPT $chunk > $chunk.out &
done
wait
cat x_??.out >> output.txt
rm -f x_??
rm -f x_??.out
最初の 2 行を次のように変更してみてください:
s/[ \t]*|[ \t]*/|/g
私が sed でできた最高のものは、このスクリプトでした:
s/[\s\t]*|[\s\t]*/|/g
s/[\s\t]*$//
s/^|/null|/
私のテストでは、これは sed スクリプトよりも約 30% 高速に実行されました。パフォーマンスの向上は、最初の 2 つの正規表現を組み合わせて、必要のない "g" フラグを省略することによってもたらされます。
ただし、30% の高速化は軽度の改善にすぎません (1 GB のデータ ファイルに対して上記のスクリプトを実行するには、約 1 時間半かかります)。もっとうまくできるかどうか見てみたかった.
結局、私が試した他の方法 (awk、perl、および sed を使用したその他のアプローチ) は、もちろん、単純な古い C 実装を除いて、うまくいきませんでした。 C で予想されるように、コードはここに投稿するには少し冗長ですが、他のどの方法よりも高速なプログラムが必要な場合は、それを参照してください。
私のテストでは、C の実装は sed スクリプトにかかる時間の約 20% で完了しました。そのため、Unix サーバーで実行するには約 25 分程度かかる場合があります。
C 実装の最適化にはあまり時間をかけませんでした。アルゴリズムを改善できる場所がたくさんあることは間違いありませんが、率直に言って、すでに達成されている時間を大幅に短縮できるかどうかはわかりません.どちらかといえば、他の方法 (sed、awk、perl、python など) から期待できるパフォーマンスの種類に上限があることは確かだと思います。
編集: 元のバージョンにはマイナーなバグがあり、出力の最後に間違ったものを出力する可能性がありました (たとえば、そこにあってはならない「null」が出力される可能性があります)。今日は時間をかけてそれを見て、それを修正しました。 strlen()
への呼び出しも最適化しました これにより、パフォーマンスがわずかに向上しました。