대형 파티션의 "grep: out of memory" 오류

대형 파티션의 "grep: out of memory" 오류

Linux 명령 메모를 사용하여 텍스트 파일을 편집하고 있을 때 텍스트 파일의 상당 부분이 누락된 것을 발견했습니다(아마 붙여넣지 않고 복사한 것 같습니다). 문제는 이미 문서를 저장했다는 것입니다. (간단한 편집기이므로 숨겨진 복사본이 없습니다)

이제 블로그 게시물 몇 개를 찾았습니다(특히 이건예) grep을 사용하여 파티션에서 텍스트 문자열을 쉽게 검색하는 방법을 보여줍니다.

$ sudo grep -a -C100 'sudo lshw -c' /dev/sdb2 > file.txt

그러나 얼마 후에 나는 다음과 같은 사실을 이해하게 되었습니다.

grep: memory exhausted

내 이해는이 답변메모리보다 큰 행을 읽는 작업이라 grep비슷한 코드가 필요할 줄 알았는데, find.

3TB 하드 드라이브의 2TB NTFS 파티션입니다.

답변1

grep 프로그램은 한 번에 한 줄씩 메모리로 읽습니다. 줄은 하나의 개행 문자부터 다음 개행 문자까지의 모든 것으로 정의됩니다. 바이너리 데이터의 경우 줄 바꿈 없이 큰 공간이 있을 수 있습니다.

을 사용해 볼 수 있습니다 grep -z. 이는 grep에게 줄 바꿈 대신 입력 레코드 구분 기호로 null 바이트를 처리하도록 지시합니다. 매우 큰 이진 데이터 블록은 개행 문자보다 널 바이트를 포함할 가능성이 적습니다. 실제로 개행 문자가 없을 가능성이 가장 높은 데이터 블록은 디스크의 아직 기록되지 않은 영역에 있는 긴 널 바이트 문자열입니다. 널 바이트를 포함하지 않는 대량의 텍스트 데이터는 메모리를 소모할 만큼 크지 않을 수 있습니다. 또 다른 이점 grep -z은 출력에 단 한 줄이 아닌 전체 텍스트 블록(일반적으로 1-4kB)이 포함된다는 것입니다.

grep 대신 전용 유틸리티를 사용해 볼 수 있습니다.사진 기록(부분테스트 디스크). 이름에도 불구하고 사진에만 국한되지 않습니다. 이러한 유틸리티는 파일 시스템 구조를 알고 있으므로 때때로 연속되지 않은 여러 블록에 걸쳐 삭제된 파일을 복구할 수 있습니다.

물론, 이전 데이터를 복구할 수 있다는 보장은 없습니다. 덮어쓰였을 수도 있습니다.

관련 정보