2016-11-17 13 views
3

私のプロジェクトで特定の操作をより効率的にする方法について考えています。現在の実装では、オブジェクトストアからすべてのオブジェクトをロードし、配列全体を反復し、オブジェクトにプロパティがないかどうか、またはプロパティが未定義であるかどうかをテストし、そのオブジェクトのセットを2番目の配列で収集し、これらのオブジェクト。プロパティがないindexedDBオブジェクトストアからオブジェクトを削除する効率的な方法

私はすでに、カーソルの繰り返しよりも明らかなパフォーマンス上の利点のためにgetAllを使用しています。

個別の削除要求が同時に呼び出されているため、値が見つからない非キーパス小道具のバッチ削除をサポートするようにindexedDB APIが進化しています。

問題は、各オブジェクトをメモリに完全にロードせずにプロパティがオブジェクトストアのキーパスにないときにプロパティをチェックする方法がないことです。オブジェクトはかなり大きい場合もあります。時には、各オブジェクトのプロパティの1つが非常に大きい(本質的にhtmlドキュメントの文字列)。

オブジェクトに存在しないプロパティや値を持たないプロパティはインデックスに表示されないため、インデックスを使用できません。

このようなオブジェクトをメモリに読み込まないようにする方法はありますか?

パーティショニングと2つのオブジェクトストアを使用して、クエリ可能な小道具用と完全なデータ用のものを考えました。しかし、これは読まれるたびに余分な要求をすることに変わる。私のアプリは、この時々バッチ削除操作を読んでからさらに多くのことを行います。

私は0/1を含んでおり、したがってインデックス可能なmyObject.doesOtherPropertyHaveValueのような値を常に持つオブジェクトごとに追加のプロパティを格納することを考えましたが、これは素晴らしいとは思われません。もちろん、このインデックスだけをクエリしてgetAllKeysを使用すれば問題を解決できます。しかし、今やすべてのadd/putはこの機能的依存性を維持しなければなりません。

アドバイスありがとうございます。

答えて

2

レコードの形式が{key, prop}の場合、propが存在しない場合は、[key, prop]にインデックスを作成できます。これは、支柱が存在する場合にのみ索引レコードを持ちます。次に、2つのキーのみのカーソルを開きます.1つはストア(C1)に、もう1つはインデックス(C2)にあります。 C1.primaryKeyがC2.primaryKey [0]に等しいかどうかを確認してください。そうであれば、支柱が存在し、両方を進める。キーがでない場合、と等しくなり、C1は小道具を持たないレコードを指します。削除してC1を進めてください。繰り返す。 (範囲の終わりに当たったときのエッジケースに注意してください。)

これは2つの問題があります:(1)あなたはまだカーソルを使用しているので、往復のコストは(getAll()とは異なります)、(2)propが大きい場合あなたは言及しています)そして、キーのカーソルを使っていても、大量のデータをシャッフルしています。

(将来的にはおそらくdelete-on-indexと組み合わせmore general query mechanismcustom indexingのいずれかを追加することによって、このタックルしたいのですが - これは非常に簡単に、より効率的になるだろうそのいずれか)

...集めますその後、二番目の配列で、そのようなオブジェクトのセット、およびこれらのオブジェクトのすべてを削除...

あなたは、このアプローチに固執する場合は、あなたがそれらを見つけると、あなたがdelete()コールを発行することができますことを覚えておいてください。すべてのオブジェクトを収集する必要はなく、削除が完了するまで待つ必要はありません。書き込み操作のためにIDBを「ファイヤー・アンド・ファー」形式で使用することができます。

+0

ありがとうございました。私は基本的にオブジェクトからの削除をobjまたはobj.prop = nullまたはobj.prop = undefined;でないところから削除したいので、インデックスのデータを削除したいと思います。データはjsにロードされません。私が火の中で忘れてしまった1つの問題は、 'Promise.all(削除).catch()'の構文より '' Promise.all(deleteRequestPromises);を待っています。もちろん、私はインデックス上で削除した場合、私はこれが必要ではないだろうが、私はちょうどそれが現在の作品の方法についての点を追加したいと思った。 – Josh

1

パフォーマンスを向上させるには、非正規化が必要な場合があります。 indexedDBのドキュメントから、あなたが残念なことに必要とする方法を照会する方法はありません。

真のボトルネックがI/OまたはJS-landにデータをマーシャリングする場合は、データを圧縮してから実際に何かを行う必要があるときに圧縮してみてください。 GZIPはテキストを非常にうまく圧縮しますが、時には最大70%も圧縮します。いつものように、ベンチマーク、

https://github.com/nodeca/pako

しかし:あり仕事ができるJSのためのいくつかのGZIPライブラリがあります!

関連する問題