Finden Sie, was geändert wurde, und laden Sie nur Änderungen hoch

8

Ich suche hier nur Ideen / Vorschläge; Ich bitte nicht um eine vollständige Lösung (obwohl, wenn Sie eine haben, würde ich mich freuen, es anzusehen)

Ich versuche einen Weg zu finden, nur Änderungen an Text hochzuladen. Es wird höchstwahrscheinlich als cloudbasierte Anwendung verwendet, die auf jQuery und HTML läuft, wobei ein PHP-Server das Backend ausführt.

Zum Beispiel, wenn ich Text wie

habe %Vor%

Und ich ändere es zu

%Vor%

Ich möchte nicht die ganze Sache hochladen (der Text kann ziemlich groß werden)

Zum Beispiel könnte etwas wie 8,X , das an den Server gesendet wurde, bedeuten: add an X to the 8th position

Oder D8,3 könnte bedeuten: go to position 8 and delete the previous 3 terms

Wenn jedoch eine einzelne Anfrage auf dem Weg zum Server beschädigt ist, könnte das gesamte Dokument beschädigt werden, da die Positionen geändert würden. Ein einfacher Hash könnte Korruption erkennen, aber wie würde man dann von der Korruption erholen? Der Client wird alle Daten haben, aber die Daten sind möglicherweise sehr groß und es ist unwahrscheinlich, dass sie hochgeladen werden können.

Danke, dass Sie das gelesen haben. Hier finden Sie eine kurze Zusammenfassung der Vorschläge, die Sie benötigen

  • Änderung / Änderungserkennung
  • Methode, um die Änderungen zu kommunizieren
  • Wiederherstellung vor Korruption
  • Alles andere, was verbessert werden muss
Kranu 05.11.2010, 06:55
quelle

3 Antworten

4

Es gibt bereits ein akzeptiertes Formular zum Übertragen dieser Art von "Differenzen" -Informationen. Es heißt Unified Diff .

Der Google-diff-Match-Patch bietet Implementierungen in Java, JavaScript, C ++ , C #, Lua und Python.

Sie sollten in der Lage sein, den "Originaltext" und den "Modifizierten Text" in Variablen auf dem Client zu behalten, dann das Diff in Javascript zu generieren (via diff-match-patch), zusammen mit ein Hash, und konstruiere es neu (entweder mit diff-match-patch oder dem unix "patch" -Programm) auf dem Server.

Sie sollten auch eine "Version" (oder ein Änderungsdatum) berücksichtigen, wenn Sie den Originaltext an den Client senden. Fügen Sie dann die gleiche Version (oder das gleiche Datum) in die "diff-Anfrage" ein, die der Client an den Server sendet. Überprüfen Sie die Version auf dem Server vor dem Anwenden des Vergleichs, um sicherzustellen, dass die Kopie des Servers nicht von der Kopie des Clients abweicht, während die Änderung vorgenommen wurde. (Damit dies funktioniert, müssen Sie die Versionsnummer jedes Mal, wenn die Masterkopie aktualisiert wird, auf dem Server aktualisieren.)

    
Lee 05.11.2010, 07:22
quelle
1

Sie haben einen wirklich interessanten Ansatz. Aber wenn die Textdateien wirklich so groß sind, dass sie jedes Mal zu viel Zeit benötigen, um sie hochzuladen, warum schicken Sie dann das ganze an den Kunden? Muss der Client wirklich die gesamte 5-MB-Textdatei erhalten? Wäre es nicht möglich, ihm nur das zu schicken, was er braucht?

Wie auch immer, zu Ihrer Frage: Das erste, was mir in den Sinn kommt, wenn ich "große Textdateien" höre und Änderungen erkenne, ist diff . Für den Algorithmus lesen Sie hier . Dies könnte ein Ansatz zum Festschreiben der Änderungen sein, und es gibt ein Format für sie an. Sie müssten nur diff (oder einen Teil davon) in Javascript neu erstellen. Das wird nicht einfach, aber möglich, wie ich denke. Wenn der Algorithmus Ihnen nicht hilft, möglicherweise mindestens die Definition des diff-Dateiformats.

Zum Korruptionsproblem: Sie müssen nicht befürchten, dass Ihr Datum auf dem Weg beschädigt wird, weil das TCP-Protokoll, auf dem HTTP basiert, aussieht, dass alles ankommt, ohne beschädigt zu werden. Was Sie befürchten sollten, ist das Zurücksetzen der Verbindung. Könnten Sie vielleicht so etwas wie einen Händedruck machen? Wenn der Client ein Update an den Server sendet, wendet der Server die Änderungen an und behält eine alte Version der Datei bei. Um sicherzustellen, dass der Client die Bestätigung von dem Server erhalten hat, dass die Änderung in Ordnung war (dort findet der Verbindungs-Reset statt), sendet der Client eine weitere Ajax-Anforderung an den Server zurück. Wenn dieser nicht innerhalb einer bestimmten Zeit zum Server kommt, wird die Datei auf der Serverseite zurückgesetzt.

Eine andere Sache: Ich weiß nicht, ob Javascript es mag, solche riesigen Dateien / Daten zu handhaben ...

    
joni 05.11.2010 07:19
quelle
1

Das klingt nach einem Problem, das Versionsverwaltungssysteme (CVS, SVN, Git, Bazaar) bereits sehr gut lösen.

Sie sind alle ziemlich einfach auf einem Server einzurichten, und Sie können mit ihnen über PHP kommunizieren.

Nach dem Setup erhalten Sie kostenlos: Versionierung, Protokollierung, Rollback, Behandlung gleichzeitiger Änderungen, korrekte Vergleichssyntax, Tagging, Verzweigungen ...

Sie würden nicht die Funktion "Nur die Updates senden" erhalten, nach der Sie gefragt haben. Ich bin mir nicht sicher, wie wichtig das für dich ist. Reine Texte sind wirklich sehr billig zu senden, soweit Bandbreite betroffen ist.

Ich persönlich würde wahrscheinlich einen ähnlichen Kompromiss eingehen wie Wikis. Zerlege den ganzen Text in kleinere semantisch kohärente Chunks (Kapitel oder sogar Absätze), bestimme auf der Clientseite, welche Chunks bearbeitet wurden (ohne auf die Zeichenebene zu gehen), und sende diese.

Der Server könnte dann mit einem Diff antworten, das von Ihrem Versionsverwaltungssystem generiert wurde, was sehr effizient ist. Wenn Sie gleichzeitige Änderungen zulassen möchten, stoßen Sie möglicherweise auf Fälle, in denen Editoren manuelle Zusammenführungen durchführen müssen.

Ein weiterer allgemeiner Hinweis könnte sein, zu sehen, was Google mit Wave gemacht hat. Ich muss hier allgemein bleiben, weil ich es selbst nicht im Detail studiert habe, aber ich glaube mich zu erinnern, dass es ein paar Artikel darüber gab, wie sie das Echtzeit-Bearbeitungsproblem gelöst haben, was genau zu sein scheint was du gerne machen würdest.

Zusammenfassend glaube ich, dass das Problem, das Sie angehen wollen, alles andere als trivial ist. Es gibt Tools, die viele der damit verbundenen Probleme bereits angehen, und ich persönlich würde den Ansatz zugunsten einer viel geringeren Arbeitsbelastung kompromittieren und neu formulieren / p>     

Thomas 05.11.2010 07:23
quelle