Java Delta File Change

Xot

-
ID: 413078
L
26 November 2006
451
36
Hallo zusammen,

Folgendes Problem:
Ich habe eine Client/Server Struktur. Auf dem Client befinden sich mehrere 100 Textdateien (10 - 100MB) die sich häufiger Ändern (Log-Files). Diese Files sollen immer sobald sie geändert wurden auf den Server übertragen werden.

Bisher werden die kompletten Dateien übertragen und auf dem Server ersetzt. Da in letzter Zeit die Übertragung immer länger dauert suche ich eine Möglichkeit nur den geänderten Teil zu übertragen.

Meine Überlegung bisher:
Die Files die sich auf dem Server befinden auch lokal in einem anderen Ordner aufbewahren. Wird nun ein Textfile im eigentlichen Ordner geändert Vergleiche ich beide Files und Übertrage nur die Änderung. Dies würde jedoch doppelt so viel Speicherplatz belegen. Da es hier um mobile Geräte geht, haben wir leider nur einen sehr begrenzten Speicherplatz zur Verfügung.

Hat jemand eine andere Lösung für dieses Problem?
 
Keine Ahnung, ob ich das Problem jetzt richtig verstanden hab, aber wenn du nur übertragen willst, was sich geändert hat,

  • diff
  • übertragen
  • patch
Bedingt ein UNIX-Betriebssystem, wo diff und patch verfügbar sind und natürlich, dass die Datei, die du patcht vorher denselben Stand hatte, wie damals, wie du gedifft hast.

(Was hat das mit Java zu tun?)
 
  • Like
Reaktionen: Xot
(Was hat das mit Java zu tun?)

Das er es in Java implementieren muss, und somit keine Unix Tools zur Verfügung stehen. Möglicherweise es auch nicht möglich ist, einen Patch zu erstellen, da man den Vorher-Zustand der Datei nicht kennt.

Ich würde es ähnlich wie rsync machen: Die Datei in Chunks aufteilen und zu jedem Chunk den Hash (sha1) an den Server senden und der bestimmt dann, welche Chunks übertragen werden sollen. Wenn solche einzelne Chunk-Vergleiche im Gegensatz zu der wirklichen Übertragung schneller sein sollten, könnte man auch ggf. wie bei Quadtrees die Änderung immer weiter eingrenzen:
den Chunk nochmal halbieren und hashen, sollte nur bei einem die Prüfsume sich unterscheiden den gleichen Prozess wieder für den Chunk usw.
 
  • Like
Reaktionen: Xot
Du sprichst da von Logfiles. Üblicherweise werden Logfiles ja nur insofern verändert, dass etwas angehängt wird.

Unter diesen Voraussetzungen würde ich folgenden einfachen Ablauf vorschlagen:
1) Das eigentliche Logfile liegt in einem seperaten Ordner.
2) Das schreibende Programm erstellt das Logfile im gewohnten Verzeichnis jedes mal neu.
3) Sobald ein Logfile nun angelegt wurde, wird es gelesen und gelöscht. Die gelesenen Daten werden an das Logfile im seperaten Ordner angehängt. Gleichzeitig werden die Daten zum Server geschickt. Dieser hängt die Daten an die entsprechende Server-Logdatei an.

Wenn es kritische Daten sind, brauchst du noch ein Protokoll um zu erkennen, ob am Server alle Daten angekommen sind.
 
Die Datei in Chunks aufteilen und zu jedem Chunk den Hash (sha1) an den Server senden und der bestimmt dann, welche Chunks übertragen werden sollen.

Dieser Ansatz gefällt mir, ich werde mal schauen auf welche Datengrösse ich das runterbreche um die beste Performance zu erhalten.

Du sprichst da von Logfiles. Üblicherweise werden Logfiles ja nur insofern verändert, dass etwas angehängt wird.

Angehängt stimmt bisher, jedoch werden diese auch auf dem Client benötigt. Desweiteren soll das Ganze später auf weitere Dateitypen ausgeweitet werden, daher fällt diese Option weg.