Möchten Sie diese Frage verbessern? Fügen Sie Details hinzu und klären Sie das Problem, indem Sie diesen Beitrag bearbeiten.
Vor 6 Jahren geschlossen.
Verbessern Sie diese Frage
Ich habe eine große Datei (2-3 GB, binäres, undokumentiertes Format), die ich auf zwei verschiedenen Computern verwende (normalerweise verwende ich sie auf einem Desktop-System, aber wenn ich reise, speichere ich sie auf meinem Laptop). Ich verwende rsync, um diese Datei hin und her zu übertragen.
Ich mache von Zeit zu Zeit kleine Aktualisierungen an dieser Datei und ändere weniger als 100 kB. Dies geschieht auf beiden Systemen.
Das Problem mit rsync, wie ich es verstehe, ist, dass es die vollständige Datei überträgt, wenn es glaubt, dass sich eine Datei zwischen Quelle und Ziel geändert hat. In meiner Situation fühlt es sich wie eine große Zeitverschwendung an, wenn nur ein kleiner Teil einer Datei geändert wird. Ich stelle mir ein Protokoll vor, bei dem die Transferagenten an Quelle und Ziel zuerst die gesamte Datei prüfen und dann das Ergebnis vergleichen. Wenn sie feststellen, dass die Prüfsumme für die gesamte Datei unterschiedlich ist, teilen sie die Datei in zwei Teile, A und B, und prüfen sie separat.
Aha, B ist auf beiden Maschinen identisch, ignorieren wir diese Hälfte. Jetzt teilt es A in A1 und A2. Ok, nur A2 hat sich geändert. Splitte A2 in A2I und A2II und vergleiche usw. Mache dies rekursiv, bis es z. B. drei Teile gefunden hat, die sich zwischen Quelle und Ziel unterscheiden und jeweils 1 MB groß sind, und übertrage dann nur diese Teile und füge sie an der richtigen Position in der Zieldatei ein. Heute mit schnellen SSDs und Multicore-CPUs sollte eine solche Parallelisierung sehr effizient sein.
Meine Frage ist also, gibt es heute Tools, die so funktionieren (oder auf andere Weise, die ich mir nicht vorstellen kann, aber mit ähnlichen Ergebnissen)?
Eine Bitte um Klarstellung wurde veröffentlicht. Ich benutze meistens Mac, also ist das Dateisystem HFS+. Normalerweise starte ich rsync so
rsync -av --delete --progress --stats
– in diesen Fällen verwende ich manchmal SSH und manchmal rsyncd. Wenn ich rsyncd verwende, starte ich es wie folgt:rsync --daemon --verbose --no-detach
.
Zweite Klarstellung:Ich frage entweder nach einem Tool, das nur das Delta für eine Datei überträgt, die an zwei Orten mit kleinen Änderungen vorhanden ist, und/oder ob rsync dies wirklich anbietet. Meine Erfahrung mit rsync ist, dass es die Dateien vollständig überträgt (aber jetzt gibt es eine Antwort, die dies erklärt:rsync benötigt einen rsync-Server, um nur die Deltas übertragen zu können, andernfalls (z. B. mit ssh-shell) überträgt es das Ganze Datei, obwohl sich viel geändert hat).
Verwandte:Wann würden Sie einen zusätzlichen Dateideskriptor verwenden?Akzeptierte Antwort:
Rsync verwendet keine Deltas, sondern überträgt die vollständige Datei vollständig, wenn es – als einzelner Prozess – für die Quell- und Zieldateien verantwortlich ist. Es kann Deltas übertragen, wenn ein separater Client- und Serverprozess auf den Quell- und Zielcomputern läuft.
Der Grund, warum rsync keine Deltas sendet, wenn es der einzige Prozess ist, besteht darin, dass es die Quell- und Zieldateien lesen muss, um festzustellen, ob es ein Delta senden muss. Wenn es fertig ist, hätte es die Datei genauso gut direkt kopieren können.
Wenn Sie einen Befehl dieser Form verwenden, haben Sie nur einen rsync-Prozess:
rsync /path/to/local/file /network/path/to/remote/file
Wenn Sie einen Befehl dieser Form verwenden, haben Sie zwei rsync-Prozesse (einen auf dem lokalen Host und einen auf dem Remote) und Deltas können verwendet werden:
rsync /path/to/local/file remote_host:/path/to/remote/file