방법(메모리 제한) > grep -F -f file_A file_B >> output.txt

방법(메모리 제한) > grep -F -f file_A file_B >> output.txt

file_A(~500MB, 160만 줄)는 정렬되지 않은 한 줄당 1개씩, 동일한 길이의 모든 검색어로 구성됩니다.

file_B는 같은 길이의 모든 텍스트 줄로 구성됩니다(한 줄에 1개씩, 정렬되지 않음).

52GB RAM이 있는 상자에서 모든 크기의 file_B에 대해 "grep -F -f file_A file_B >> output.txt"를 실행할 수 있었습니다. 문제 없습니다. 문제는 이제 메모리가 4GB로 제한되어 있어 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

관련 정보