2016-05-25 14 views
5

レルムをアプリケーションのデータベースソリューションとして使用しています。私は自分のイメージのために永続的な記憶力を必要とするので、オフラインで読み込むことができます。また、キャッシュが必要です。そのため、セルが描画するたびにAPIからイメージをフェッチするのではなく、そこからイメージをロードできます。私の最初の考えは、レルムのデータベースをNSDataとしてレルムに格納すると、これらの機能の両方をうまく機能することができたということでした。しかし、SE(herehere)には、頻繁に変更されるような大きなサイズの画像がたくさんある場合、これを行わないことをお勧めする2つの回答があります。その代わりに、イメージをディスクに保存して、レルムのイメージにURLを保存することをお勧めします。レルムではなくディスクにイメージを保存することをお勧めします。

私の質問は、なぜこのベストプラクティスですか?上にリンクされた答えは、あなたが肥大化したデータベースで終わると言うことを除いて理由を示していません。しかし、それはなぜ問題なのでしょうか?ディスク上にたくさんのイメージを持っているのとデータベースのイメージがたくさんあることの違いは何ですか?

スピードの問題ですか?もしそうなら、アプリケーションがディスクからディスクにアクセスして、Realmのようなデータベースソリューションからアクセスできるようになっていることに、著しい速度差があるのでしょうか?

ありがとうございます。

答えて

10

これは本当にRealmにローカライズされた問題ではありません。コアデータについても同じアドバイスが与えられていることを覚えています。

私は、データベースに大きなバイナリデータを格納することをおすすめしない理由は、「あなたは何も得られず、実際には他のものよりも多くを失うからです」と主張しています。

コアデータ(つまり、SQLiteによってバックアップされたデータベース)では、SQLiteからの読み取りを実行するときにデータがメモリにコピーされるため、実際にはパフォーマンスが低下します。大量のデータであれば、これはまったく受け入れられません。

ゼロコピー、メモリマップされたメカニズムを使用しているため、少なくともNSDataがRealmファイルから直接マッピングされますが、これもまた単純にディスク自体からイメージファイルをロードしました。

これは、レルムで大きな問題になるのは、イメージの変更を頻繁に開始する場合です。 Realmは実際にはスレッド間でデータを変更する際に内部スナップショットメカニズムを使用しますが、基本的には操作中にデータ全体がディスクに定期的に複製されることを意味します。データセットに大量のバイナリデータが含まれていると、これらのデータセットも重複して表示されます(パフォーマンスヒットも意味する可能性があります)。この場合、ディスク上のRealmファイルのサイズが増えてスナップショットに対応しますが、操作が完了してスナップショットが削除されると、元のサイズに縮小されません。これは、ディスクスペースの再利用がコスト高となり、スペースを再度必要とする可能性があるため(つまり、別の大きなスナップショット操作によって)、先制的には効率的ではないように見えるからです。

必要に応じて手動でこのディスク領域を再利用する操作を実行することはできますが、一般に推奨される方法は、最初にこのことが起こらないようにコードを最適化することです。

大量のデータブロブをデータベースに保存することは可能ですが、時間がたつにつれてパフォーマンスの低下やファイルサイズの増大を招く可能性があります。これらの種類のデータベースは、小さなデータをディスクに保存したり取り出したりできる形式に変換するのに役立つように設計されているため、バイナリファイルで無駄になります。

大規模なバイナリデータをディスクに保存し、ファイル名の参照をデータベースに保存するだけで、はるかに簡単で、よりクリーンで、効率的です。 :)

+1

優秀な回答、ありがとうございます! –

関連する問題