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
。
同じ仮定で、cleaned1
2つの大きなファイルとを並べ替えることができれば、whichをwhichに置き換えることができ、cleanedR
かなり高速です。grep
comm -1 -3 cleaned1 cleanedR
それ以外の場合は、分割cleaned1
(たとえばsplit -l 100000
)してチャンクで実行できます。これらの grep (例: greps grep -Fvxf chunk1 cleanedR | grep -Fvxf chunk2 | ... > cleaned2
) を接続して、複数の CPU で並列化することもできます。