Jak różnicować duże pliki w systemie Linux

31

Występuje diff: memory exhaustedbłąd podczas próby różnicowania dwóch plików 27 GB, które są w dużej mierze podobne na komputerze z systemem Linux z CentOS 5 i 4 GB pamięci RAM. Wygląda na to, że jest to znany problem.

Spodziewałbym się, że istnieje alternatywa dla tak niezbędnego narzędzia, ale nie mogę go znaleźć. Wyobrażam sobie, że rozwiązanie musiałoby wykorzystywać pliki tymczasowe zamiast pamięci do przechowywania potrzebnych informacji.

  • Próbowałem użyć rdiffi xdelta, ale są one lepsze do pokazywania zmian między dwoma plikami, jak łatka, i nie są tak przydatne do sprawdzania różnic między dwoma plikami.
  • Próbowałem VBinDiff , ale jest to narzędzie wizualne, które jest lepsze do porównywania plików binarnych. Potrzebuję czegoś, co może przesyłać różnice do STDOUT jak zwykle diff.
  • Istnieje wiele innych narzędzi, takich jak te, vimdiffktóre działają tylko z mniejszymi plikami.
  • Czytałem również o bdiffsystemie Solaris, ale nie mogłem znaleźć portu dla systemu Linux.

Jakieś pomysły poza podzieleniem pliku na mniejsze części? Mam 40 takich plików, więc staram się uniknąć pracy nad ich rozpadem.

Tom B.
źródło
jakiej wersji xdelta próbowałeś? xdelta3 czy xdelta1?
nmuntz
To była wersja 1.1.4. Czy xdelta3 zapewnia inną funkcjonalność? Właśnie sprawdziłem dokument online i nadal wydaje się, że chodzi o zapewnienie „delt”.
Tom B
Zobacz również tę odpowiedź: unix.stackexchange.com/a/77259/27186
unhammer

Odpowiedzi:

12

cmprobi bajty po bajcie, więc prawdopodobnie nie zabraknie pamięci (po prostu przetestowałem to na dwóch plikach o pojemności 7 GB) - ale być może szukasz bardziej szczegółowych informacji niż lista „plików X i Y różnią się bajtami x , linia y ”. Jeśli podobieństwa twoich plików są przesunięte (np. Plik Y ma identyczny blok tekstu, ale nie w tej samej lokalizacji), możesz przekazać przesunięcia do cmp; prawdopodobnie możesz to zmienić w porównanie zsynchronizowane za pomocą małego skryptu.

Na bok: w przypadku, gdy ktoś inny wyląduje tutaj, szukając sposobu na potwierdzenie, że dwie struktury katalogów (zawierające bardzo duże pliki) są identyczne: diff --recursive --brief(lub diff -r -qkrótko, a może nawet diff -rq) będą działać i nie zabraknie pamięci.

Felix
źródło
fajnie, myślę, że -q jest tutaj kluczem, jakoś nie posiadanie go może wymagać diff do
zapisania
7

Znalazłem ten link

diff -H może pomóc lub możesz spróbować zainstalować port textproc / 2bsd-diff, który najwyraźniej nie próbuje załadować plików do pamięci RAM, dzięki czemu może łatwiej pracować z dużymi plikami.

Nie jestem pewien, czy wypróbowałeś te dwie opcje lub czy mogą one działać dla Ciebie. Powodzenia.

Jarvin
źródło
1
Czy to pomaga komukolwiek? Dla mnie ta sama porażka ...
rogerdpack
12
Dla każdego, kto zastanawia się: diff -Hjest nieudokumentowanym i przestarzałym aliasem diff --speed-large-files.
a3nm
1
Ta odpowiedź nie pomaga. To jest pytanie o Linuksa i aby zainstalować 2bsd-diff, musisz najpierw go portować. Po znalezieniu źródła . I załatałem to . Możliwe, ale mało prawdopodobne, realne rozwiązanie.
nyov
1

Jeśli pliki są identyczne (tej samej długości), z wyjątkiem kilku wartości bajtów, możesz użyć skryptu podobnego do następującego ( wliczba bajtów na wiersz do zrzutu heksowego, dostosuj do szerokości wyświetlania):

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

To nie jest bardzo szybkie, ale działa.

Tino
źródło