8

私は、アプリケーションの2つのバージョン間でCoreDataモデルを移行しています。以前のバージョンではバイナリデータをブロブとして保存していましたが、パフォーマンスのためにブロブから取り出したいと思います。私の問題は、移行中にコアデータがすべてメモリに読み込まれてメモリ不足が発生し、アプリケーションが強制終了されるように見えるということです。コアデータの移行中にメモリ不足

アップルのドキュメント、次のことを示唆している: http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreDataVersioning/Articles/vmCustomizingTheProcess.html#//apple_ref/doc/uid/TP40005510-SW9

しかし、大きなオブジェクトが異なるマッピングを適用しているという事実に依存しているようです。 私の場合、すべてのオブジェクトは基本的に同じで、それぞれに同じマッピングを適用する必要があります。私はこの場合どのように自分の技術を適用することができないのか分かりません。

非常に大きなオブジェクトでの移行をどのように処理する必要がありますか?

答えて

2

私は、ブロブからデータを引き出すだけでなく、たくさんの変更を加えたいと思っています。私の提案は、いくつかの段階で移行を行うことです。私はここで大声で考えているので、これを改善することは可能かもしれません。これには、SQLiteを使用する必要があります。

この作品を作るために、あなたはあなたのモデルの3つのバージョンを持っているつもりだ:

  1. オリジナルモデル
  2. モデル取り出し(そしておそらく特別なユニークなIDを持つ属性とをadded-- )以下
  3. 属性

これを行う理由を置き換える新しいエンティティの追加など、あなたが行った変更、および関係のすべてでモデルを参照することはTRAということですバージョン1からバージョン2への移行は、自動軽量移行で実行可能でなければなりません。その場合、Core Dataはメモリに何もロードする必要はありません。データベース上で直接変更を加えるためにSQL文を発行するだけです。

したがって、古いモデルのバージョンを使用して永続的なストアコーディネータを設定することから始めます。データをロードしたら、移行するすべてのオブジェクトを調べ、バイナリ属性を抽出して何らかの形でディスクに書き出します。バッチ処理および定期的な自動解放プールの排水を伴うフェッチ要求を使用して、一時オブジェクトに多すぎるメモリを使用しないようにすることができます。 NSCachesDirectoryで取得したディレクトリにデータを格納します。データをオブジェクトのmanagedObjectIDに関連付ける方法でデータを格納することは明らかです。

次に、すべてをシャットダウンし、Core Dataにバージョン1からバージョン2にストアを移行するように依頼します。詳細は、this linkを参照してください。バージョン2のストアを開きます。

軽量ではないオブジェクトIDをコアデータが保持しているかどうかわからないため、ある種の一意のIDを各オブジェクトに割り当てるステップを追加する必要があります。移行。これを行う必要がある場合、バージョン2のモデルは、バイナリデータを取得するオブジェクトに新しい属性を追加します。この属性はオプションであるか、デフォルト値が設定されています。軽量マイグレーションはmanagedObjectIDを変更してはならないので、2つ前のパラグラフのバイナリデータとともに保存したmanagedObjectIDに新しいユニークIDのマッピングを保存することができます。

データを保存してストアを閉じます。

ストアを開き、バージョン2からバージョン3への移行を実行します。これは、基本的に質問を投稿する前に書いたコードです。ストアが開いたら、バージョン1ストアから保存したすべてのオブジェクトを追加し、途中で保存したデータを使用してリレーションシップを設定します。

シンプル、右?

+0

ありがとうジャック、実際にはこれは私に良いヒントを与え、私はSQLiteと同じくらい低くすることなく似たようなことをしました。しかし、私は自分自身を2つの異なる店舗にして、それぞれにオブジェクトを作成しています。難しいのは、Core Dataが、オブジェクトが使用されるとすぐに障害に変わることを確認することです。 – Kamchatka