0

最小 220,000 エントリのデータベースを持つ辞書アプリを設計しています。最初に単一のエンティティを使用してデータを保存し、データベースの検索パフォーマンスが低下した後、データベースの設計を変更して、各アルファベットに基づくエンティティを作成しました。

次に、私が使用していた方法は、検索オブジェクトに一致するすべてのデータを NSArray にフェッチすることであったため、パフォーマンスが受け入れられませんでした (キーストロークごとに UIView が約 3 秒間フリーズしました)。そのため、NSFetchResultController に変更しました。FRC により、アプリの応答性が大幅に向上しました (キー ストロークあたり 1 ~ 1.5 秒) が、それでもこれは許容できる結果ではありません。

パフォーマンスを向上させるために、さらにご案内いただければ幸いです。

4

2 に答える 2

1

ディクショナリのエントリを格納および検索するための優れたデータ構造は、Trie (または Knuth volume 3 p492) です。この構造体を使用しているときに Core Data を使用してデータを保存したい場合は、 のサブクラスで構造体を実装する必要がありNSAtomicStoreます。

于 2012-04-18T10:22:40.200 に答える
0

CoreData はオブジェクト グラフであるため、任意の並べ替え/検索アルゴリズムを実装できます。ここでは確かにトライが良いでしょう...そしてトライは簡単に実装できます。

ただし、それを行う前に、CoreData の新しい (より新しい) 機能を使用し、検索に使用している属性にインデックスを追加します。

Xcode を使用してモデルを起動し、エンティティを選択します。次に、右端の属性インスペクタで、エンティティに名前を付ける場所のすぐ下に、検索インデックスを設定する場所があります。驚くべきことに、それは「インデックス」と呼ばれています。

すべての検索を行う属性をそれに追加します。データベースはそのフィールドのインデックスを維持し、検索するときにデータベース全体を直線的に検索する必要はありません。

于 2012-04-18T17:08:44.200 に答える