方法(メモリ制限)> grep -F -f file_A file_B >> output.txt

方法(メモリ制限)> grep -F -f file_A file_B >> output.txt

file_A(〜500 MB、160万行)は、並べ替えられていない1行につき1つずつ、同じ長さのすべてのクエリで構成されます。

file_Bは、同じ長さのすべてのテキスト行で構成されています(1行に1つずつ、ソートされていません)。

52 GB RAMのあるボックスで、任意のサイズのfile_Bに対して「grep -F -f file_A file_B >> output.txt」を実行できました。問題ありません。問題は、メモリが4 GBに制限されているため、file_Aのサイズが大きすぎて使用可能なメモリを使い果たさずに実行できないことです。

file_Aをより小さな塊に手動で切り取ることに加えて、file_Aの最初の1000行をgrepし、操作が完了したら自動的に1001-2000行をgrepするようにスクリプトする簡単な方法はありますか? file_Aをすべて探すまで?

ベストアンサー1

file_A チャンクを繰り返して、同じ grep ステートメントに標準入力として送信し、使用可能なメモリーに 1000 を調整します。

nlines=$(wc -l < file_A)
chunk=1000
for((i=1; i < nlines; i += chunk)) 
do 
  sed -n $i,+$((chunk - 1))p file_A | grep -F -f - file_B
done > output

おすすめ記事