Realmファイルが肥大化するときの対処法
バージョンは2.0.3です。
Realmを使っているとRealmファイルの容量が以上に大きくなっている場合があります。放っておくと数十MGから数百MBになったりします。
そのせいでアプリがクラッシュしたり、ずっと開けなくなったりするので大変です。
Realmファイルの容量が考えているよりも大きい場合は{{ RLMRealm }}は古い履歴データを残している可能性があります。
・・・中略・・・
この余分な領域は、最終的には再利用されるか消去されます。(強制的に空き領域を消去するには、
Realm().writeCopyToPath(_:encryptionKey:)を使ってファイルをコピーします。そのとき、自動的にファイルサイズが最適化されます。)
invalidateメソッドを呼び出し、Realmにこれまでに取得したデータはもう必要なくなったことを知らせてください。
そうすると、Realmは中間データの履歴を解放します。そして、次のアクセスのときに最新のデータを使うようにRealmが更新されます。
公式ドキュメントに上記のようにあるので、realm.writeCopy(toFile: )を使うかinvalidateを使うかで対応できます。
私の場合は、強制的にやりたかったので前者でRealmファイルの最適化を行なっています。
古い履歴データを消去するとスピードが遅くなるかと懸念していましたが、そこまで変わらなかったのでアプリを閉じた時に毎回消去を行っています。
消去のタイミングはそれぞれで測ってもらった方が良いと思います。
具体的にはAppDelegate.swiftにて以下のようにしました。
func applicationDidEnterBackground(_ application: UIApplication) { do { let realm = try! Realm(configuration: self.realmConfigulation()) try! realm.writeCopy(toFile: self.filePath().deletingLastPathComponent().appendingPathComponent("temp.realm")) try FileManager.default.removeItem(at: self.filePath()) try FileManager.default.moveItem(at: self.filePath().deletingLastPathComponent().appendingPathComponent("temp.realm"), to: self.filePath()) } } catch let error as NSError { print("Error - \(error.localizedDescription)") } }