質問: invalidateが.realmに与える影響と、writeToCopyURLが.realmに与える影響をご教授いただけないでしょうか? どちらの関数も.realmファイルのサイズを小さくできておりますが、Realmが何をしてファイルを小さくしているのか知りたいのです。 realmに保存しているデータは個人情報など非常に大事な情報も含まれます。 各関数が.realmに与える影響や、具体的に何をしているのか教えてください。
回答: まず勘違いされていますが、`invalidate()`はファイルの増加を間接的に抑制する効果がありますが、ファイルを小さくするわけでは **ありません** 。 RealmはMVCC(Multi version concurrent control)という仕組みでトランザクションを管理しています。 これは簡単にいうとトランザクションごとにその時点のスナップショットを持ち、別のトランザクション中に読み込みがあった場合は古いデータのスナップショットを返すことでデータの一貫性を保ちつつ、読み込みは書き込みと競合することがないという利点を持っています。そのため、間接的にファイルサイズの増加を抑えられる可能性があります。 ただし、トランザクションを長い間開いていた場合、スナップショットのデータが多量に作成されることがあります。`invalidate()`はRealmに現在生きているオブジェクト(=スナップショット)にもうこれ以上アクセスすることはなく、破棄しても構わないということを、マニュアル操作で伝えるメソッドです。それにより、スナップショットが不要に作成されることを防ぐ効果が期待できます。 不要になったスナップショットの領域は後に再利用されますが、Realmはその領域を自動的に取り除くことはしません。そのためRealmのファイルサイズは基本的には増加するだけで減少することは **ありません** 。 しかし、それでは不便なので、将来の空き領域として保持されている不要なスナップショットのデータを取り除いて最適化する操作が用意されています。 Realmではその操作をコンパクションと呼んでいます。コンパクションのAPIは公開されてないので、直接呼ぶことはできません。その代わりに、`writeToCopyURL()`のメソッドを使うことで、コピー先のファイルはコンパクション済みのファイルになります。元のファイルが小さくなるわけではありません。かつ必ず小さくなるわけでもありません。あくまで、不要なスナップショット領域がある場合に、その部分が除去されるのでファイルサイズが小さくなります。 参考までに、半自動的にコンパクションを行うAPIとして`shouldCompactOnLaunch`という設定があります。これを使うと、Realmを最初に開く時に、内部でファイルのコピーを作成し、オリジナルと入れ替えるという操作をして、あたかも元のファイルがコンパクションされたかのように振舞うことができます。