0

私には2つのモデルがあり、それらの間には多対多の関係があります。モデルAは空の状態で開始しますが、モデルBには約22万件のレコードがあります(非常に大きなインデックスがありますが、このモデルは更新されないため、影響はありません)。

A->Bからのto-manyは次のとおりです。

  • オプション=>false
  • 一時的=>false
  • インデックス付き=>true
  • 順序付け=>true
  • minCount => 0
  • maxCount => NSIntegerMax
  • deleteRule => NSCascadeDeleteRule

B->Aからのto-manyは次のとおりです。

  • オプション=>true
  • 一時的=>false
  • インデックス付き=>false
  • 順序付け=>false
  • minCount => 0
  • maxCount => NSIntegerMax
  • deleteRule => NSNullifyDeleteRule

そしてもちろん、それぞれの関係は他の関係の逆として設定されます。私が直面している問題は次のとおりです。新しいエンティティAを作成する前に、アプリはエンティティBの約2,000レコードを取得するフェッチリクエストを実行します。次に、アプリはこれらのレコードを作成しようとしているエンティティAに設定します。次に、コンテキストを保存します。問題は、2kレコードのnsorderedsetをエンティティに設定することです。iOS6.0.1を搭載したiPhone 4Sではインスタンスに4秒程度かかり、同じデバイスではコンテキストの保存にさらに4秒かかります。これにより、モデルAの新しいインスタンスを作成するのに8秒かかります。

モデルAでインデックス付きの関連付けプロパティを有効/無効にしようとしましたが、そのような違いはありませんでした。私が達成しようとしているのはとても重い仕事ですか?

いくつかのテストを行ったところ、nsorderedsetをエンティティAインスタンスに設定するのにほとんどの時間が失われたのは、逆の関係が原因であることがわかりました。ターゲットモデルで多対多の関係を逆の関係のない多対多に変更する簡単なテストを行ったところ、挿入時間は半分の時間に短縮されました。もちろん、これは多対多の関係を壊します。簡単なテストでした。

ここで何かが足りませんか?アプリはコンテキストを1回だけ保存し、各レコードBごとに1回ではないので、2kレコードを保存するのにそれほど時間はかからないはずですが、私はiPhone開発に不慣れであり、おそらくこのタスクを実行しています。この種のデバイスには多すぎます。

どんなヒントも大いに評価されるでしょう。ありがとう!

4

1 に答える 1

0

フェルデフ、

よく書かれた質問をありがとう。助けを求める前に、問題についてよく考えたことは明らかです。これは誰にとっても役立ちます。

Core Data は、保存時にブロック操作を使用していないようです。したがって、そこでパフォーマンスの問題が発生します。ただし、関係の設定は、実際に見ているよりも高速である必要があります。 . 一括フェッチが重要です。)

私はいくつかの観察を行います:

A->B 対多の関係がインデックス化され、順序付けされているのはなぜですか? 順序付けにより、挿入が遅くなります。関係を索引付けすることも意味がありますか?

一括リレーションシップ セッター ( -add<Key>:) を使用していますか?

エンティティ A のインスタンスに設定する前に、エンティティ B の 2000 レコードすべてを取得していますか?

これは挿入のパフォーマンスには影響しませんが、A->B からの削除規則がカスケードするのはなぜですか? 上に書いたエンティティ B は変化しません。

アンドリュー

于 2012-12-27T13:23:29.850 に答える