2010-11-05 5 views
8

Ich bin nur auf der Suche nach Ideen/Anregungen hier; Ich frage nicht nach einer vollständigen Lösung (obwohl, wenn Sie eine haben, würde ich mich freuen, es zu sehen)Finden Sie, was geändert wurde und laden Sie nur Änderungen

Ich versuche, einen Weg zu finden, um 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 haben wie

asdfghjklasdfghjkl 

Und ich es ändern zu

asdfghjklXasdfghjkl 

Ich will nicht die ganze Sache zu laden haben (der Text kann ziemlich groß werden add an X to the 8th position

:)

zum Beispiel so etwas wie 8,X an den Server könnte bedeuten gesendet

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

Wenn jedoch ein einziger Antrag auf dem Weg zu dem Server beschädigt ist, das gesamte Dokument beschädigt werden könnte, da die Positionen geändert werden 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.

Also danke fürs Durchlesen. Hier ist eine kurze Zusammenfassung dessen, was benötigt Vorschläge

  • Ändern/Modification Erkennung
  • Methode, um die Änderungen
  • Erholung von Korruption zu kommunizieren
  • Alles andere, was verbessert werden muss
+2

interessante Frage .. Sie müssen mit Nebenläufigkeit Probleme zu tun haben. Vielleicht senden Sie Tastenanschläge oder Speichern von Änderungen an den Server spucken in festen Zeitintervallen mit einer Revisionsnummer zu überprüfen. Ein Problem besteht darin, dass Sie, wenn der Text (sehr) groß ist, Probleme beim Umgang mit dem Client haben. – Hamish

+0

@Hamish: Um Ihr Problem anzugehen, werde ich jQuery die Bildschirmmaße des Geräts erhalten, und der Server wird genug Text senden, um 3 mal diesen Bildschirm zu füllen. Während der Benutzer scrollt, kann der Rest des Textes gestreamt werden. Ich mag Ihren Vorschlag bezüglich der Zeit/Revisionen. Das werde ich mir merken. – Kranu

+0

es sei denn, * Ihre * Bildschirme haben eine gigantische Pixelauflösung, die niemand sonst hat, 3 Bildschirme voller Text sind nicht so viele Daten zu verarbeiten. Ich denke ungefähr 50-100kb, wo ist das Problem, das ganze Ding zum Server zu schicken? – joni

Antwort

4

Es gibt bereits eine akzeptierte Form für diese Art von „Differenzen“ Informationen zu übertragen. Es heißt Unified Diff.

Die google-diff-match-patch bietet Implementierungen in Java, JavaScript, C++, C#, Lua und Python.

Sie sollten in der Lage sein, einfach den "ursprünglichen Text" und den "modifizierten Text" in Variablen auf dem Client zu behalten, dann das diff in Javascript (über diff-match-patch) zu erzeugen, an den Server zu senden mit einem Hash, und rekonstruieren Sie es (entweder mit Diff-Match-Patch oder das Unix "Patch" -Programm) auf dem Server.

Sie könnten auch eine „Version“ zu prüfen, einschließlich (oder Änderungsdatum), wenn Sie den ursprünglichen Text an den Client an erster Stelle 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 auf dem Server jedes Mal aktualisieren, wenn die Masterkopie aktualisiert wird).

+0

Wow Google hat einige ziemlich interessante Projekte im Gange, aber ich würde nicht vermuten, dass sie getan haben, was ich versuche zu tun. Leider bin ich gerade nicht auf einem vollwertigen Computer, aber ich werde das Projekt so schnell wie möglich überprüfen. – Kranu

1

Sie haben eine sehr interessanter 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" und Modifizierungserkennung höre, ist diff. Für den Algorithmus lesen Sie here. 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 zumindest die Definition des Diff-Dateiformats.

Zum Korruptionsproblem: Sie müssen nicht fü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ß es nicht, wenn Javascript mag es solche gigantischen Dateien/Daten zu handhaben ...

+0

Ich werde nur senden, was der Benutzer auf dem Bildschirm sehen kann. Zum Beispiel lädt Google Reader nur ein paar Artikel, wenn Sie es öffnen, aber während Sie durch die Artikel scrollen, lädt es mehr. Wenn zu viele Daten vorhanden sind, kann ich sie entfernen, sobald sie das Ansichtsfenster verlassen haben. Danke für Ihren Vorschlag, diff zu verwenden. Ich werde es mir später ansehen. Auch wenn ich es nicht in Javascript portieren kann. Ich bin sicher, dass der Algorithmus für mich nützlich sein wird. – Kranu

1

Das klingt wie ein Problem, das Versionsverwaltungssystem (CVS, SVN, Git, Bazaar) bereits sehr gut lösen.

Sie sind alle relativ einfach auf einem Server einzurichten, und Sie können mit ihnen durch PHP kommunizieren.

Nach dem Setup, dann würden Sie kostenlos erhalten: Versionierung, sich einzuloggen, Rollback, Handhabung von gleichzeitigen Änderungen, die richtige Syntax diff, Tagging, Niederlassungen ...

Sie würde sich nicht die ‚nur die schicken Funktionen von Updates, die Sie angefordert haben. Ich bin mir nicht sicher, wie wichtig das für dich ist. Reine Texte sind wirklich sehr billig zu senden, wenn es um die Bandbreite geht.

Persönlich würde ich wahrscheinlich ein Kompromiss ähnlich machen, was Wikis zu tun. Zerlege den ganzen Text in kleinere semantisch zusammenhängende Chunks (Kapitel oder sogar Absätze), bestimme auf der Client-Seite, welche Chunks bearbeitet wurden (ohne auf die Zeichenebene zu gehen), und sende diese.

Der Server konnte dann mit einem diff beantworten, indem Sie Ihr Versionierungssystem erzeugt, das etwas, das sie sehr effizient tun ist. Wenn Sie gleichzeitige Änderungen zulassen möchten, können Sie auf Fälle stoßen, in denen Editoren ohnehin 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 umformulieren.

Verwandte Themen