メモリの枯渇の問題を避けるためにファイルからgrepを実行する方法は?

メモリの枯渇の問題を避けるためにファイルからgrepを実行する方法は?

これには2つの大きなテキストファイルがあり、30mbそれぞれ1つずつ必要ですgrepgrep -f "file01.txt" "file02.txt" > file03.txt

これを行うと、「メモリ不足」エラーが返されます。

アルファベット順に関係なく、これらのファイルをどのように比較できますか?

答え1

file01.txt実際の内容を含まない限り一般的な表現、努力する:

grep -Ff "file01.txt" "file02.txt" > file03.txt

-F正規表現ではなく固定文字列としてgrep処理するように指示します。file01.txtこれにより、速度が大幅に向上し、メモリ要件が大幅に削減されます。

一般的な表現

あるいは、file01.txt正規表現を含める場合は、それらを複数の部分に分割してgrep各部分に個別に適用できます。

split -dn 10 "file01.txt" ./tmp-file01.
for f in ./tmp-file01.*; do grep -f "$f" "file02.txt"; done >file03.txt

上記の内容はfile01.txt10箇所に分かれています。使用可能なメモリによっては、より多くのメモリが必要になる場合があります。

file01.txt が次の場合いいえ正規表現を作成し、-F2行目に次を使用します。

for f in ./tmp-file01.*; do grep -Ff "$f" "file02.txt"; done >file03.txt

答え2

できません。スキーマはgrep使い果たされたメモリにロードする必要があります。

しかし、あなたが望むなら比較するdiffファイルを直接(内容を整理した後)使用してみてはいかがでしょうか?

パターンごとに1行(例:MD5リスト):

while read md5; do
    grep -w "$md5" file02.txt
done < file01.txt > file03.txt

もちろん、これは特に大容量file02.txt(キャッシュに合わない場合)の場合ははるかに遅いですが、file01.txtパターンのすべてのサイズで機能します。

関連情報