Linux에서 큰 파일을 다른 방법으로 나누는 방법


31

나는군요 diff: memory exhausted에 CentOS 5와 4GB의 RAM을 가진 리눅스 박스에 대체로 비슷 사랑하는 두 27기가바이트 파일을 시도 할 때 오류가 발생했습니다. 이것은 알려진 문제입니다.

그러한 필수 유틸리티에 대한 대안이있을 것으로 기대하지만 찾을 수는 없습니다. 솔루션이 필요한 정보를 저장하기 위해 메모리 대신 임시 파일을 사용해야한다고 생각합니다.

  • 나는 rdiffand 을 사용하려고 시도했지만 xdelta패치와 같이 두 파일 간의 변경 사항을 표시하는 것이 좋으며 두 파일의 차이점을 검사하는 데 유용하지 않습니다.
  • VBinDiff를 시도 했지만 이진 파일을 비교하는 데 더 적합한 시각적 도구입니다. regular과 같은 차이점을 STDOUT에 파이프 할 수있는 것이 필요합니다 diff.
  • vimdiff더 작은 파일에서만 작동하는 것과 같은 다른 많은 유틸리티가 있습니다.
  • 솔라리스에 대해서도 읽었 bdiff지만 Linux 용 포트를 찾을 수 없습니다.

파일을 작은 조각으로 나누는 것 외에 다른 아이디어가 있습니까? 나는이 파일 중 40 개를 가지고 있으므로 파일을 끊는 작업을 피하려고합니다.


어떤 버전의 xdelta를 사용해 보셨습니까? xdelta3 또는 xdelta1?
nmuntz

버전 1.1.4입니다. xdelta3는 다른 기능을 제공합니까? 방금 온라인 문서를 확인했는데 여전히 "델타"를 제공하는 것으로 보입니다.
Tom B


이 답변도 참조하십시오 : unix.stackexchange.com/a/77259/27186
unhammer

답변:


12

cmp바이트 단위로 작업을 수행하므로 메모리가 부족하지 않을 것입니다 (두 개의 7GB 파일에서 테스트 한 것). "파일 XY 가 바이트마다 다른 목록보다 더 자세한 정보를 찾고있을 수 있습니다 x , 라인 y ". 파일의 유사성이 오프셋 된 경우 (예를 들어, 파일 Y 는 동일한 텍스트 블록을 갖지만 동일한 위치에 있지는 않음) 오프셋을 cmp; 작은 스크립트와의 재 동기화 비교로 바꿀 수 있습니다.

따로 : 두 개의 디렉토리 구조 (매우 큰 파일 포함)가 동일하다는 것을 확인하는 방법을 찾을 때 다른 사람이 여기에 착륙하는 경우 diff --recursive --brief(또는 diff -r -q짧거나 어쩌면 diff -rq) 메모리가 부족하지 않습니다.


-q가 여기에 핵심이라고 생각합니다. 어쨌든 전체 파일 (또는 적어도 전체 라인)을 메모리에 저장하기 위해 diff가 필요하지 않을 수도 있습니다.
rogerdpack

7

링크를 찾았습니다

diff -H가 도움이 될 수도 있고 파일을 RAM에로드하지 않는 textproc / 2bsd-diff 포트를 설치하여 큰 파일에서 더 쉽게 작업 할 수 있습니다.

이 두 가지 옵션을 시도했는지 또는 그들이 당신을 위해 효과가 있는지 확실하지 않습니다. 행운을 빕니다.


1
이것은 누구에게나 도움이됩니까? 나를 위해, 같은 실패 ...
rogerdpack

12
궁금한 사람 diff -H은 : 에 대한 문서화되지 않고 더 이상 사용되지 않는 별칭입니다 diff --speed-large-files.
a3nm

1
이 답변은 도움이되지 않습니다. 이것은 리눅스 질문이며 2bsd-diff를 설치하려면 먼저 포팅해야합니다. 소스찾은 후 . 그리고 그것을 패치했다 . 가능하지만 실행 가능한 솔루션은 아닙니다.
nyov

1

몇 바이트 값을 제외하고 파일이 동일한 (길이가 같은) 경우 다음과 같은 스크립트를 사용할 수 있습니다 ( w16 진 덤프에 대한 줄당 바이트 수, 표시 너비에 맞게 조정).

w=12;
while read -ru7 x && read -ru8 y;
do
  [ ".$x" = ".$y" ] || echo "$x | $y";
done 7< <(od -vw$w -tx1z FILE1) 8< <(od -vw$w -tx1z FILE2) > DIFF-FILE1-FILE2 &

less DIFF-FILE1-FILE2

빠르지는 않지만 일을합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.