ギガバイトサイズのファイルで作業すると、過度のメモリ使用量が原因でgrepがクラッシュします。

ギガバイトサイズのファイルで作業すると、過度のメモリ使用量が原因でgrepがクラッシュします。

grepコマンドがあります

grep -Fvf cleaned1 cleanedR > cleaned2

あまりにも多くのメモリを使用してコンピュータを実行してシャットダウンします。

  • cleanRはファイルリスト(1,400万個)で、dowork.sh cleanRを介して何かを実行する必要があり、完了したすべてのジョブはclean1に印刷されます(異なるソート順になっているため、diffは機能しません)。
  • clean1はファイルのリストです(1,000万)。
  • 別のタスクを実行するには、dowork.shタスクをキャンセルする必要がありましたが、後で別のリスト(dowork.sh clean2)で再起動できました。 clean2はまだ存在しません
  • clean2は400万のファイルのリストになります。まだdowork.shを実行していません。
  • デフォルトでは、次の計算を実行する必要があります(減算操作)。クリーンアップされたファイルのリストR - クリーンアップされたファイルのリスト1 =クリーンアップされたファイルのリスト2

clean1 と cleanR は絶対ファイル構造を含むファイルで、何百万ものファイルがあり、これは大容量ファイルです。 clean1は1.3G、cleanRは1.5Gです。

約30Gの空きメモリがありましたが、すべてのメモリを使用して競合が発生しました。

ここでgrepがなぜramを使うのか疑問に思います。 ramに別の一時ディレクトリを使用させることはできますか?ソートには-Tオプションがあります。だから私はgrepに似た方法を探しています。

私は別のアイデアで開いています。

-fは、文字列正規表現の代わりに数百万の式(ファイル名)でclean1を実行します。 1行に1つのファイル-Fはその行で正確に一致します。ファイル名は複雑になる可能性があり、grepは一部の文字を不要な正規表現文字と間違える可能性があるため、完全行一致を実行します。 -vは減算/削除操作です。

ベストアンサー1

まず、仮想行はcleaned1の行全体と一致する必要がありcleanedR、これを使用すると利点が得られますgrep -x

同じ仮定で、cleaned12つの大きなファイルとを並べ替えることができれば、whichをwhichに置き換えることができ、cleanedRかなり高速です。grepcomm -1 -3 cleaned1 cleanedR

それ以外の場合は、分割cleaned1(たとえばsplit -l 100000)してチャンクで実行できます。これらの grep (例: greps grep -Fvxf chunk1 cleanedR | grep -Fvxf chunk2 | ... > cleaned2) を接続して、複数の CPU で並列化することもできます。

おすすめ記事