Ich entwickle derzeit ein OTA/FOTA-Update-System, das in einem Embedded-Gerät mit einem ARM CORTEX M0 + laufen muss. Mein Hauptproblem ist die FLASH Platzmangel und die Netzwerk-Netzwerk-Bandbreite, die ich habe, so dass die Delta-Patches kleiner sein sollten, desto besser.bsdiff ohne Komprimierung erzeugt große Delta-Patch-Dateien
Um dieses Ergebnis zu erhalten, habe ich einige Nachforschungen angestellt und einige binäre Diff-Algorithmen und Werkzeuge wie bsdiff, xdelta oder Zucchini gefunden. Mein Problem mit allen von ihnen war die Größe, weil ich dies für den Betrieb eine sehr kleine kompilierte Anwendung haben müssen, so habe ich eine bsdiff Standalone-Version (eigentlich waren sie zwei Versionen: bsdiff Standalone und minibsdiff):
https://github.com/Cheedoong/bsdiff
https://github.com/thoughtpolice/minibsdiff
Die erste benutzt noch bzip2 aber eigenständige und am besten geeignet für ein eingebettetes System, aber ich wollte 2 Dinge testen:
Wie ist die Größe des unkomprimierten Delta. Also habe ich versucht, die gesamte bzip2-Logik zu entfernen und das zu bekommen. Ich war sehr überrascht, als ich bemerkte, dass die Größe des Deltas der Größe der vollständigen Originaldatei entsprach, also sprang ich zur zweiten Quelle, der Minibsdiff.
Das Minibsdiff ist das Bsdiff, aber ohne jegliche Komprimierung, sodass Sie die gewünschte Komprimierung verwenden können. Es diente mir auch zu überprüfen, dass ich nicht falsch lag und dass der erzeugte unkomprimierte Deltapatch die gleiche Größe hatte (oder ein bisschen mehr, weil der Header und andere ich vermute) als die ursprüngliche Datei, die ich patchen wollte.
Also ... Was ist hier los? Ich lese etwas googeln, dass sehr ähnliche Dateien größere Patches generieren, aber ... während der Tests habe ich 8 KB große Dateien verwendet, 8KB unkomprimierte Patches zu bekommen ist keine Lösung, denn dann wäre es vielleicht besser, nur die Datei zu komprimieren und die alte zu ersetzen Einer durch den Neuen. Ich fühle, dass mir etwas fehlt.
Jede Idee wird sehr geschätzt.
Danke euch allen.
Mit freundlichen Grüßen,
Iván.
Nicht sicher, was Ihre eigentliche Frage ist. Du hast bereits beschrieben "was hier passiert". Aber wenn Sie diff, müssen Sie auf das Ziel mit dem tatsächlichen Inhalt mergen, bevor Sie blinken. Wie auch immer, ohne weitere Details ist es schwer, eine nützliche Antwort zu geben. Sie müssen möglicherweise zuerst ein wenig länger nachdenken. – Olaf
Hallo Olaf. Meine Frage ist, warum dies geschieht, weil ich vorhabe, kleine Deltas zu bekommen, nicht solche mit derselben Größe wie die ursprüngliche Datei. Ich versuche, die Suffixsortierung zu studieren, die bsdiff implementiert, weil möglicherweise nicht für eine 250K oder weniger Dateien verwendbar ist. Und ja, wenn ich diff muss ich zusammenführen, aber die Diff-Datei ist riesig und sollte klein sein, zumindest kleiner als das Original. Wenn ich nicht weiter gehe, dann tue ich so, als würde ich meinen eigenen Algorithmus nicht entwickeln, sondern einen benutzen, der bereits benutzt wird. Danke trotzdem. – Fulgor3
Es gibt verschiedene Möglichkeiten, Diffs zwischen Dateien zu kodieren. Jeder hat seine Anwendung. Alles hängt davon ab, was Sie erwarten. Wenn Ihre Erwartung nicht erfüllt ist, können Sie das Konzept sprengen. Darauf gibt es keine einfache Antwort und die Frage wäre - selbst nachdem alle Informationen gegeben wurden - zu weit gefasst. Machen Sie einen Test, schauen Sie sich die Dateien an und definieren Sie möglicherweise Ihr eigenes Format/Werkzeuge. Wenn Sie nicht herausfinden und/oder die Erfahrung fehlt, mieten Sie einen Berater, für den sich nichts zu schämen ist. Stack Overflow ist jedenfalls keine Beratungsseite. – Olaf