Memory mapped äquivalent für FirefoxOS

8

Wie würden Sie eine Memory-Mapped-Datei in FirefoxOS, Tizen oder einer anderen mobilen pure-JS-Lösung emulieren?

Der Anwendungsfall ist für einen mobilen Browser und Sie benötigen eine Menge Daten, die nicht in den RAM passen oder Sie möchten RAM dafür noch nicht verschwenden und es lieber faul laden.

Das einzige, was ich gefunden habe, ist IndexedDB oder was kann ich dagegen tun? Irgendwelche besseren Tricks oder APIs?

Hmmh es sieht aus wie Web SQL Datenbank könnte auch eine Lösung auf Android, Tizen oder iOS sein. Aber Firefox unterstützt es nicht (?)

Update : Ich frage wegen einige experimente

    
Karussell 25.04.2014, 14:45
quelle

1 Antwort

3

Zunächst einmal wird Web SQL niemals standardisiert, wie in der Spezifikation erklärt, also sollte es so sein nur für WebKit / Blink-basierte Browser berücksichtigt.

In this queston , obwohl die Kartenkacheln in dieser Frage berücksichtigt werden, denke ich, dass sie immer noch relevant für Ihren Anwendungsfall sind.

Ich glaube, dass Sie mit IndexedDB für die Diagrammdaten auf dem richtigen Weg sind. Auf einer höheren Ebene handelt es sich um einen asynchronen Schlüsselwert-Objektspeicher (siehe Dokument mit den Grundbegriffen ). Für Ihren Anwendungsfall können Sie Grafikknoten in einem Objektspeicher indizieren. Es gibt zum Beispiel die Bibliothek LevelGraph , die Diagrammdaten in IndexedDB speichert, obwohl sie für Semantic-Web-Triples erstellt wurde. HeliosJS ist ebenfalls erwähnenswert, obwohl es sich um eine speicherinterne Graphendatenbank handelt.

Bearbeiten: Die aktuelle API für IndexedDB ist asynchron. Es gibt eine synchrone API , die in der Spezifikation entworfen wurde und nur im Web verwendet werden könnte Arbeitskräfte. Leider implementiert derzeit keine Engine diese Funktion. Es gibt einen ausstehenden Patch für Gecko , aber ich habe keine Pläne für Blink oder WebKit gefunden ist jetzt keine sinnvolle Option.

Es ist möglich, über Web-APIs auf Raw-Dateien zuzugreifen. Sie können XHR2 verwenden, um eine (lokale) Datei als Binärdatei zu laden. Blob . Leider ist XHR2 hauptsächlich für das Streaming von Dateien und nicht für einen wahlfreien Zugriff gedacht, obwohl Sie die Daten in mehrere Dateien aufteilen und bei Bedarf anfordern könnten, aber das kann langsam sein. Der direkte Zugriff auf Dateien ist derzeit ziemlich begrenzt, FileList und createObjectURL werden hauptsächlich für direkte Dateibenutzereingaben verwendet ( durch Drag-and-Drop oder Datei-Eingabefeld), FileSystem API wurde kürzlich getötet, und die DeviceStorage ist nicht standardisiert und privilegiert (Firefox OS-spezifisch). Sie können auch Dateien in IndexedDB speichern, die für FileHandle API beschrieben sind. Sobald Sie jedoch Zugriff auf das rohe Dateiobjekt erhalten, können Sie das Blob verwenden. Slice Methode, um Teile der Datei zu laden - es gibt ein großes Beispiel zum Lesen von Datei-Chunks über Upload-Formular . Vielleicht möchten Sie auch jDataView Bibliothek & amp; Freunde, die die Handhabung von Binärdaten durch den effizienteren ArrayBuffer erleichtern.

Bearbeiten: Wie für die synchrone API localStorage (auch bekannt als DOM Storage) könnte ebenfalls berücksichtigt werden. Es ist auch ein Schlüssel-Wert-Speicher, aber viel viel einfacher und begrenzter als IndexedDB:

  • Die Größe des Speichers ist begrenzt, normalerweise auf 5 MB
  • Nur eine localStorage pro Domäne / Anwendung (Sie können mehrere benannte Objektspeicher in IndexedDB haben).
  • Nur Strings können gespeichert werden.

Im Allgemeinen ist localStorage ein nützlicher Ersatz für Cookies, aber zum Speichern großer Offline-Daten ist es nicht wirklich nützlich.

Um es zusammenzufassen:

  • IndexedDB ist die einfachste und am weitesten verbreitete Option, obwohl sie langsam oder ineffizient ist oder Speichergrenzen mit sehr großen Daten erreicht. Außerdem ist derzeit nur asynchrone API möglich.
  • Raw-Dateizugriff ist ohne Benutzerinteraktion schwer zu erhalten, und die APIs sind instabil und nicht standardisiert.

Am Ende können Sie beide Ansätze kombinieren, beachten Sie dabei zwei Möglichkeiten:

  • Verwenden Sie XHR2, um die große Datei in Blöcken zu analysieren und die analysierten Knoten in IndexedDB zu speichern
  • Speichern Sie die große Datei in IndexedDB (über XHR), verwenden Sie FileHandle.getFile um das Dateiobjekt und Blob zu laden.Slice , um seinen Inhalt zu lesen.

In allen Fällen können (sollten) Sie Web Workers verwenden, um mit Daten zu arbeiten Manipulation und Berechnungen im Hintergrund.

Wie auch immer, GraphHopper sieht gut aus, uns fehlen solche nicht-trivialen Offline-Anwendungen für Firefox OS, also viel Glück!

    
jnv 21.05.2014, 17:58
quelle