10

IndexedDB に大量の小さなオブジェクトを格納しています。ユーザーがオブジェクト ストアの 1 つを「ダウンロード」できるファイルにエクスポートできるようにしたいと考えています。

このブログ記事を読みました。これは、データの読み取り、データのJSON.stringifying、 でのエンコード、データのダウンロードに使用できるリンクencodeURIComponentの としての配置について説明しています。hrefこのようなもの:

var transaction = db.transaction([objectstore], "readonly");
var content = [];
var objectStore = transaction.objectStore(objectstore);

objectStore.openCursor().onsuccess = function(event) {
    var cursor = event.target.result;
    if (cursor) {
        content.push({key:cursor.key,value:cursor.value});
        cursor.continue();
    }
}; 

transaction.oncomplete = function(event) {
    var serializedData = JSON.stringify(dataToStore);
    link.attr("href",'data:Application/octet-stream,'+encodeURIComponent(serializedData));
    link.trigger("click");
};

それは問題ありませんが、オブジェクト ストアには数百万のレコードがあり、これでは十分なパフォーマンスが得られないと思います。ユーザーがオブジェクトストアをファイルとして保存できるようにする方法はありますか (Web ページ経由で再度インポートできる方法で)。


編集コメントのいくつかのメモから、もう少し効果を得るために、これがどのように機能するかを少し書き直しました。新しいコードは次のようになります。

var transaction = db.transaction([objectstore], "readonly");
var objectStore = transaction.objectStore(objectstore);

objectStore.getAll().onsuccess = function(evt) {
    var url = window.URL.createObjectURL(new Blob(evt.target.results, {'type': 'application/octet-stream'}));
    link.attr('href', url);
    link.trigger('click');
};

次のような結果が得られます。

  • 10,000 レコード、平均エクスポート時間 975.87 ミリ秒
  • 100,000 レコード、5,850.10 ミリ秒の平均エクスポート時間
  • 100 万件のレコード、56,681.00 ミリ秒の平均エクスポート時間

ご覧のとおり、100 万件のレコードをエクスポートするには約 1 分かかります。これを行うためのより良い方法はありますか?(代わりにカーソルを使用してみました.getAll()が、カーソルは遅くなります)

4

1 に答える 1