So unterscheiden Sie große Dateien unter Linux


31

diff: memory exhaustedBeim Versuch, zwei 27-GB-Dateien zu unterscheiden, die auf einer Linux-Box mit CentOS 5 und 4 GB RAM weitgehend ähnlich sind , wird eine Fehlermeldung angezeigt. Dies ist anscheinend ein bekanntes Problem.

Ich würde erwarten, dass es eine Alternative für solch ein wesentliches Hilfsprogramm gibt, aber ich kann keine finden. Ich stelle mir vor, die Lösung müsste eher temporäre Dateien als Speicher verwenden, um die benötigten Informationen zu speichern.

  • Ich habe versucht, rdiffund zu verwenden xdelta, aber sie sind besser, um die Änderungen zwischen zwei Dateien anzuzeigen, wie ein Patch, und nicht so nützlich, um die Unterschiede zwischen zwei Dateien zu untersuchen.
  • Versuchte VBinDiff , aber es ist ein visuelles Werkzeug, das besser zum Vergleichen von Binärdateien ist. Ich brauche etwas, das die Unterschiede zu STDOUT wie normal leiten kann diff.
  • Es gibt viele andere Dienstprogramme vimdiff, die nur mit kleineren Dateien funktionieren.
  • Ich habe auch über Solaris gelesen, bdiffaber ich konnte keinen Port für Linux finden.

Haben Sie außer der Aufteilung der Datei in kleinere Teile noch weitere Ideen? Ich habe 40 dieser Dateien, also versuche ich zu vermeiden, dass sie getrennt werden.


welche version von xdelta hast du probiert? xdelta3 oder xdelta1?
Nmuntz

Es war Version 1.1.4. Bietet xdelta3 unterschiedliche Funktionen? Ich habe gerade das Online-Dokument überprüft und es scheint immer noch darum zu gehen, "Deltas" bereitzustellen.
Tom B


Siehe auch diese Antwort: unix.stackexchange.com/a/77259/27186
unhammer

Antworten:


12

cmpTut Dinge byteweise, so dass es wahrscheinlich nicht zu wenig Speicher gibt (es wurde nur an zwei 7-GB-Dateien getestet) - aber Sie suchen möglicherweise nach mehr Details als eine Liste von Dateien, bei denen sich X und Y byteweise unterscheiden x , Zeile y ". Wenn die Ähnlichkeiten Ihrer Dateien versetzt sind (z. B. Datei Y enthält einen identischen Textblock, jedoch nicht an derselben Stelle), können Sie Offsets an übergeben cmp. Sie könnten es wahrscheinlich in einen resynchronisierenden Vergleich mit einem kleinen Skript verwandeln.

Nebenbei: Falls noch jemand hier landet, um zu bestätigen, dass zwei Verzeichnisstrukturen (mit sehr großen Dateien) identisch sind: diff --recursive --brief(oder diff -r -qkurz, oder vielleicht sogar diff -rq) funktionieren und nicht über genügend Arbeitsspeicher verfügen.


schön, ich denke, -q ist der Schlüssel hier, irgendwie kann es nicht Diff erfordern, um die gesamte Datei (oder zumindest ganze Zeilen) in den Speicher zu setzen ...
Rogerdpack

7

Ich habe diesen Link gefunden

diff -H könnte helfen, oder Sie können versuchen, den textproc / 2bsd-diff-Port zu installieren, der anscheinend nicht versucht, die Dateien in den RAM zu laden, damit es einfacher mit großen Dateien arbeiten kann.

Ich bin mir nicht sicher, ob Sie diese beiden Optionen ausprobiert haben oder ob sie für Sie funktionieren könnten. Viel Glück.


1
Hilft das jemandem da draußen? Für mich das gleiche Scheitern ...
Rogerdpack

11
Für alle, die sich fragen: diff -HIst ein undokumentierter und veralteter Alias ​​für diff --speed-large-files.
a3nm

Diese Antwort hilft nicht. Dies ist eine Linux-Frage, und um 2bsd-diff zu installieren, müssten Sie es zuerst portieren. Nachdem Sie eine Quelle gefunden haben . Und es geflickt . Möglich, aber unwahrscheinlich eine praktikable Lösung.
27.

1

Wenn die Dateien mit Ausnahme einiger Bytewerte identisch sind (gleiche Länge), können Sie ein Skript wie das folgende verwenden ( wist die Anzahl der Bytes pro zu hexdumpender Zeile, passen Sie sie an Ihre Anzeigebreite an):

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

Es ist nicht sehr schnell, aber macht den Job.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.