私は8コアMac OS Xで次のコマンドを実行しています。
for i in $(cat file1);do grep "$i" file2; done > output.txt
私のfile2には900万行があるので、時間がかかります。すべてのコアを使用してタスクを分割し、すべてのタスクをすばやく完了できますか?
答え1
タスクをより速くする別の方法があります。を使用してくださいgrep -f file1 file2 >output.txt
。
Gnu 並列性を使用することもできます。http://www.gnu.org/software/parallel/parallel_tutorial.html
答え2
grep -F -f needles.txt haystack.log
あなたが望むもの。
-F
完全正規表現が必要ない場合は、grepで単純なパターンマッチングを使用してください。これにより、速度が大幅に向上することがよくあります。検索する内容によっては正規表現が不要な場合があるため、より簡単なコードをより高速に実行する利点が得られます。
-f
あなたが探しているパターンファイル。したがって、Nパターンを完全にNスキャンするのではなく、一度にすべて実行できます。これは大きすぎてRAMに入ることができないファイルの速度も大幅に向上します。
検索するファイルをクイックディスクに挿入します。 grepは非常に線形な方法でスキャンするため、通常の回転ディスクに適しており、ディスクアレイがある場合は特に高速です。
両方のスイッチの組み合わせとハードドライブの速度により、grepが非常に高速になる可能性があります。データが非常に反復的であれば(圧縮性が良い)、gzip形式で保存してzgrepを使って検索してみることができます。これは、ストレージスペースが特に高速でない場合に便利です。
データがファイルに保存される方法を担当する場合は、アイテムを小さくしてください。構造スペースを無駄にせず、情報を渡さないデータ(UUID内部またはXMLタグ間のスペースや改行など)を削除して、ログを小さくします。これにより、ディスクの読み取り時間と解析時間が短縮されます。時間は短いです。
時には、二重解析を実行する方が実際に高速です。これはデータ依存度が高い。たとえば、構文解析は複雑ですが、いくつかの項目にのみ表示され、解析しやすい他の式で簡単に識別できるデータを探している場合は、単純な式に対して最初の転送を実行します。これにより、遅いまたは複雑な式を実行するために必要なデータが減ります。
それでも役に立たない場合は、split -l
ファイルをgrep
作成してくださいparallel
。複数のディスクで大容量ファイルをより小さなファイルに分割できる場合は、検索速度が速くなる可能性があります。
人々が犯す一般的な間違いは、分割されたファイルをRAMディスクに入れようとすることです。キャッシュをしているわけですね。 OSは、ファイル全体ではなく、実際に作業しているコンテンツをキャッシュするために同じ量のメモリを使用してより良いタスクを実行する可能性が高いです。
また、さまざまなシナリオで作業しながら、CPUとディスクのアクティビティを監視し、「ボトルネック」と「飽和」の違いを理解したいと思います。
答え3
に基づいてhttp://www.gnu.org/software/parallel/man.html#EXAMPLE:-Grepping-n-lines-for-m-regular-expressions
parallel -k parallel --pipepart --block 100M -a file2 -k grep {} :::: file1
より簡単で速いかもしれません。
parallel -j0 -k grep {} file2 :::: file1