0

約 100GB に相当する約 100k の gzip 圧縮された JSON ファイルがあります。すべてのファイルは同じディレクトリにあります。これを mac os x でローカルに実行しています。

一致させるパターンがいくつかあり、さまざまな方法でコマンドを実行してみましたが、すべて完了までに数時間かかります。

私はこのコマンドから始めて、ここここから引っ張ってきました:

find . -name "*.gz" | xargs zgrep pattern >> results.json

これは正常に機能しますが、完了するまでに約 4 時間かかります。

私はそれを1つ以上のパターンで並列化しようとしました:

find . -name "*.gz" | parallel zgrep pattern >> results/melanys.json

find . -name "*.gz" | parallel zgrep -e pattern1 -e pattern2 -e pattern3 -e pattern4 >> results/melanys.json

これらは確かに複数の zgrep プロセスを生成しますが、ほとんどの場合、それらはアイドル状態であり、(単一パターンのソリューションでは) より速く実行されないようです。また、複数パターンのソリューションは、シャットダウンすることを決定する前に 8 時間実行されていました。それを下げます。

zgrep にこれほど時間がかかるとは思っていませんでした。私の希望は、このデータ セットから関連する行を zgrep し、それらを分析により適した構造、おそらくローカル データベースにプラグインすることでした。

zgrepを高速化する方法はありますか?

4

2 に答える 2

1

GNU Parallel のマニュアルには、複数の正規表現に対する複数行の grep に特化したセクションがあります: http://www.gnu.org/software/parallel/man.html#EXAMPLE:-Grepping-n-lines-for-m-regular-expressions

于 2014-10-23T08:48:13.343 に答える
1

100 GB のファイルを zgrep するのに数時間かかることは驚くべきことではありません。その時間の大部分は、ファイルを解凍するだけで消費されます。必要に応じて、

time find . -name "*.gz" | xargs zcat > /dev/null

その場合、このファイルのコレクションで安価にできることはほとんどありません。zgrep が I/O バウンドでない場合、並列化から何らかの利点を得たいと思うかもしれませんが、その場合の最良の結果は、マシンの CPU コアの数に比例したスピードアップです。実際にはそれほど高速化は見られず、zgrep が I/O バウンドの場合はまったく見られません。

また、ソリッド ステート ドライブなどのより高速なメディアや、そのようなドライブで構成された RAID アレイにデータを配置することを検討することもできます。それでも、何時間も必要な状態から、数分しか必要としない状態になる可能性はほとんどありません。

ただし、必ず、1 回のパスで必要なすべてのデータを抽出するようにあらゆる努力をしてください。

于 2014-10-22T21:28:05.847 に答える