8

FirefoxOS、Tizen、またはその他の純粋なモバイル JS ソリューションで、メモリ マップされたファイルをどのようにエミュレートしますか?

使用例はモバイル ブラウザで、RAM に収まらない大量のデータが必要な場合、または RAM をまだ無駄にしたくなくて遅延読み込みを好む場合です。

私が見つけた唯一のものはIndexedDBまたはそれについて何ができますか? より良いトリックや API はありますか?

うーん、Web SQL データベースは、Android、Tizen、または iOS のソリューションにもなるようです。しかし、Firefoxはそれをサポートしていません(?)

更新:いくつかの実験のために尋ねています

4

1 に答える 1

3

まず第一に、Web SQL は仕様で説明されているように標準化されることはないため、WebKit/Blink ベースのブラウザーのみを考慮してください。

この質問にはオフライン ストレージ オプションの素晴らしい概要がありますが、その質問ではマップ タイルが考慮されていますが、それはまだあなたのユース ケースに関連していると思います。

グラフ データについては、IndexedDB を使用して正しい方向に進んでいると思います。大まかに言うと、これはキーと値の非同期オブジェクト ストアです (基本概念のドキュメントを参照してください)。ユース ケースでは、オブジェクト ストア内のグラフ ノードにインデックスを付けることができます。たとえば、セマンティック Web トリプル用に構築されていますが、IndexedDB にグラフ データを格納するLevelGraphライブラリがあります。HeliosJSも言及する価値がありますが、これはインメモリ グラフ データベースです。

編集: IndexedDB の現在の API は非同期です。仕様でドラフトされた同期 APIがあり、これは Web ワーカーでのみ使用できます。残念ながら、現在この機能を実装しているエンジンはありません。Geckoには保留中のパッチがありますが、Blink や WebKit の計画が見つからなかったため、現時点では意味のあるオプションではありません。

Web API を介して raw ファイルにアクセスできます。XHR2を使用して、(ローカル) ファイルをバイナリBlobとしてロードできます。残念ながら、XHR2 は主にストリーミング ファイル用に設計されており、ランダム アクセス用ではありません。ただし、データを複数のファイルに分割してオンデマンドで要求することはできますが、低速になる可能性があります。ファイルへの直接アクセスは現在非常に制限されており、 FileListとcreateObjectURLは主に (ドラッグ アンド ドロップまたはファイル入力フィールドを介して) ユーザーがファイルを直接入力するために使用され、FileSystem API は最近削除され、 DeviceStorageは非標準で特権付きです (Firefox OS -明確な)。FileHandle APIで説明されている IndexedDB にファイルを保存することもできます。. ただし、生の File オブジェクトにアクセスできるようになると、Blob.sliceメソッドを使用してファイルのチャンクを読み込むことができます。アップロード フォームを介してファイル チャンクを読み取る良い例があります。また、より効率的なArrayBufferを介してバイナリ データの処理を容易にするjDataViewライブラリ & フレンドも参照してください。

編集:同期 API に関しては、localStorage (別名 DOM Storage) も考慮することができます。これはキー値ストレージでもありますが、IndexedDB よりもはるかに単純で限定的です。

  • ストレージのサイズは制限されており、通常は 5 MB までです
  • ドメイン/アプリケーションごとに 1 つの localStorage のみです (IndexedDB には複数の名前付きオブジェクト ストアを含めることができます)。
  • 格納できるのは文字列のみです。

一般に、localStorage は便利な Cookie の代替品ですが、大規模なオフライン データの保存にはあまり役に立ちません。


要約すると:

  • IndexedDB は最も簡単で広く利用できるオプションですが、データが非常に大きい場合、速度が遅く、効率が悪く、メモリ制限に達する可能性があります。また、現時点では非同期 API のみが可能です。
  • ユーザーの介入なしに raw ファイルへのアクセスを取得することは困難であり、API は不安定で標準的ではありません。

最終的に、両方のアプローチを組み合わせることができます。次の 2 つのオプションが考えられます。

  • XHR2 を使用して大きなファイルをチャンクで解析し、解析されたノードを IndexedDB に格納します。
  • 大きなファイルを (XHR 経由で) IndexedDB に保存し、FileHandle.getFileを使用して File オブジェクトをロードし、Blob.sliceを使用してそのコンテンツを読み取ります。

いずれの場合も、Web Workerを使用してバックグラウンドでデータ操作と計算を処理できます (使用する必要があります)。

とにかく、GraphHopper は素晴らしく見えます。Firefox OS 用のこのような重要なオフライン アプリケーションは本当に不足しているので、頑張ってください!

于 2014-05-21T17:58:41.017 に答える