메모리 고갈 문제를 피하기 위해 파일에서 grep을 실행하는 방법은 무엇입니까?

메모리 고갈 문제를 피하기 위해 파일에서 grep을 실행하는 방법은 무엇입니까?

여기에는 두 개의 큰 텍스트 파일 이 있으며 30mb각각 하나씩 필요합니다 grep.grep -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가 다음과 같은 경우아니요정규식을 작성한 다음 -F두 번째 줄에 다음을 사용합니다.

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

답변2

그럴 수 없습니다. 스키마는 grep소진된 메모리에 로드되어야 합니다.

하지만 당신이 원한다면비교하다diff파일을 직접 (내용을 정리한 후) 사용해 보는 것은 어떨까요 ?

패턴당 한 줄(예: MD5 목록):

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

물론 이는 특히 대용량 file02.txt(캐시에 맞지 않는 경우)의 경우 훨씬 느리지만 file01.txt 패턴의 모든 크기에 작동합니다.

관련 정보