HOME » Natsu note » 古い投稿 » Core Data Performance : バイナリデータの保存

Core Data Performance : バイナリデータの保存 2010/04/25/|古い投稿,

この記事は情報が古い可能性があります。参照する際にはご注意ください。

Core Data のパフォーマンスを良くするためのテクニックはいくつか存在するが、その中でも重要だと思われるバイナリデータの扱いについて記載されている書籍を見つけたので参考までにまとめておく。


Core Data: Apple’s API for Persisting Data on Mac OS X (リンク Amazon) の6章に分かりやすい解説があった。ただし、この本は主にOSX用に書かれたものなので、目安となるバイト数はiPhoneOSでは少し変わってくるかもしれない。それでも三通りの方法を使い分けるべきだという基本概念は十分iPhoneOSにも流用できるし、各方法がどのようにパフォーマンスに効いてくるかという理論的な部分は是非理解しておきたいところ。

バイナリデータの管理方法

例えば、レシピアプリの各レシピに画像を保存し、レシピ一覧でその画像を表示することを考える。もし、画像を直接エンティティに追加したら(下記、方法1)、データをフェッチした時点ですべての画像を読みにいくことになり、また、そのすべての画像データをメモリ上に保持し続けることになる。実際、画面上に表示されていないレシピであっても、フェッチした時点ですべてを読みにいってしまう。これでは、数件のレシピ登録が限界かもしれない。そうならないためにも、以下の三通りの方法を使い分けることが重要だ。

なお、以下に例として挙げるモデル図はUIImage型の画像を保存する場合のもの。
ImageToDataTransformerはUIImage型<->UIData型の変換を行うメソッド。

方法1:小サイズ(100Kbyte 以下)

この程度の小さなサイズのデータであれば、プロパティに直接指定して問題はない。この場合、バイナリ型もしくは変換可能型の属性を用いることになる。

Coredata performance bin model 1Attribute image

方法2:中サイズ(100 Kbyte 以上 1 Mbyte 以下)

この場合もプロパティとしてデータを直接保存してよいが、メインとなるエンティティで管理するのではなく、バイナリデータを管理するためのエンティティを作成し、メインのエンティティからは「関連」として参照する。方法1のモデル図と比較してみると、image属性がMainEntityからImageEntityに移っていることがわかる。

Coredata performance bin model 2
Attribute image

関連プロパティは、フェッチ時にロードされるのではなく、いったんフォールト(fault)と呼ばれるプレースホルダオブジェクトに格納される。実際のロードは、初めてそのエンティティにアクセスしたときに行われる。これにより、本当にデータを必要とするときに(画像表示などのタイミング)ロードすることができる。

方法3:大サイズ(1 Mbyte 以上)

これら大きなサイズのバイナリデータはCore Dataのデータベース上ではなくディスクに直接保存されるべきである。この場合、メインとなるエンティティにバイナリデータへのパスを保存する。

Coredata performance bin model 3Attribute imagepath

アップルのサンプルで確認

アップルのサンプルである iPhoneCoreDataRecipesでは、方法2を用いている。以下の管理オブジェクトモデルで確認してみよう。

Coredatarecipes model

まとめ

紹介した本ではバイナリデータのサイズだけを元に解説されていたが、実際には、保存する管理オブジェクトの上限(レシピの例だと最高10個のレシピしか管理しないのか1000個管理するのか)や、表示に必要となるデータの種類にも依存してくると思う。

それらを加味しつつ、最終的には実機で確認しながらチューンナップをすることになるだろう。その際に、理論を知っているのといないのとでは大きな違い。上記の3つの手法を知っていれば、あとは実際に動かしながらどの方法が一番適しているかを探っていけばいい。

関連リンク

9月発売のiPhone用Core Data本。発売が待ち遠しい。
Core Data for iPhone: Building Data-Driven Applications for the iPhone and iPod Touch (Core Frameworks Series)

Stack Overflowでの議論。おそらく参照した本は同じでしょう。
CoreData : store images to DB or not? | Stack Overflow

参考文献

Core Data: Apple’s API for Persisting Data on Mac OS X

Core Data: Apple's API for Persisting Data on Mac OS X
Marcus S. Zarra
Pragmatic Bookshelf
売り上げランキング: 41060
More iPhone 3 Development: Tackling Iphone Sdk 3 (Beginning)
Dave Mark Jeff Lamarche
Apress
売り上げランキング: 29207