時間の経過とともに、Realm で使用されるストレージ領域は断片化され、必要以上のスペースを消費する可能性があります。 内部ストレージの範囲を再確認してファイル サイズを縮小するには、Realm ファイルを圧縮する必要があります。
Realm のデフォルトの動作は、Realm ファイルが大きくなりすぎるのを防ぐために、ファイルを自動的に圧縮することです。 自動圧縮がユースケースに十分でない場合は、手動圧縮戦略を使用できます。
自動圧縮
バージョン 1.6.0 の新機能。
SDK は、ファイル内のデータを継続的に再割り当てし、未使用のファイル領域を排除することで、Realm ファイルをバックグラウンドで自動的に圧縮します。 自動圧縮は、ほとんどのアプリケーションの Realm ファイル サイズを最小限に抑えるのに十分です。
自動圧縮は、ファイル内の未使用領域のサイズがファイル内のユーザー データのサイズの 2 倍を超えると開始されます。 自動圧縮は、ファイルがアクセスされていない場合にのみ行われます。
手動圧縮オプション
手動圧縮は、ファイル サイズをより厳密に管理する必要があるアプリケーションや、自動圧縮をサポートしていない古いバージョンの SDK を使用するアプリケーションに使用できます。
Realm は、ファイルの新しい(圧縮)バージョンを書き込み、元のファイルを新しく書き込まれたファイルに置き換えることで、ファイル サイズを縮小します。 そのため、圧縮するには、元の Realm ファイル サイズと同等の空きストレージ領域が必要です。
Realm が開かれるたびにデータベースを自動的に圧縮するように Realm を構成することも、最初に Realm インスタンスを取得せずにファイルを圧縮することもできます。
Realm 構成ファイル
構成用の compactOnLauth関数のコールバックを設定することで、Realm ファイルを開くたびに Realm ファイルを圧縮するように Realm を構成できます。 compactOnLaunch構成に {4 を呼び出すと、ファイルがtrigger 50MB 以上で、かつ50 Realm ファイル内のスペースの % 以上が未使用の場合に、 DEFAULT_COMPACT_ON_LAUNCH_CALLBACK が されます。アプリケーションのニーズに応じて、 compactOnLaunchを呼び出すときにカスタム圧縮設定を指定できます。 次のコード例は、これを行う方法を示しています。
// Set a max file size equal to 100MB in bytes val maxFileSize = 100 * 1024 * 1024 val config = RealmConfiguration.Builder(setOf(King::class)) .compactOnLaunch{ totalBytes, usedBytes -> // totalBytes refers to the size of the file on disk in bytes (data + free space) // usedBytes refers to the number of bytes used by data in the file // Compact if the file is over the max file size and less than 50% 'used' (totalBytes > maxFileSize) && ((usedBytes / totalBytes) < 0.5) } .build() val realm: Realm = Realm.open(config)
Realm. compactRealm メソッド
あるいは、 compactRealmメソッドを呼び出すと、開かずに Realm ファイルを圧縮 することもできます。
val config = RealmConfiguration.create(schema = setOf(Item::class)) var compacted = Realm.compactRealm(config)
compactRealmメソッドは、操作が成功した場合は true を返し、成功しない場合は false を返します。
重要
compactRealm はWindows (JVM)では使用できず、NotImplementedError がスローされます。
圧縮コピーの作成
Realm.writeCopyTo メソッドを使用して、Realm の圧縮された(およびオプションで 暗号化された )コピーを別のファイルの場所に保存できます。宛先ファイルがすでに存在することはできません。
重要
書込みトランザクション内でwriteCopyToを呼び出さないようにします。 書込みトランザクション内で呼び出されると、このメソッドは最新のデータをコピーします。 これには、このメソッドを呼び出す前にトランザクション内で行ったコミットされていない変更が含まれます。
Realm を手動で圧縮するためのヒント
Realm を手動で圧縮すると、リソースが集中する操作になる可能性があります。 Realm を開くたびにアプリケーションが圧縮されないようにする必要があります。 代わりに、アプリケーションが圧縮を最適化して、ファイルサイズが大きくなりすぎるのを防ぐのに十分な頻度で圧縮を行います。 アプリケーションがリソースが制限された環境で実行されている場合、一定のファイルサイズに達したときや、ファイルサイズがパフォーマンスに悪影響を及ぼす場合は、圧縮する必要がある場合があります。
これらの推奨事項は、アプリケーションの圧縮の最適化を開始するのに役立ちます。
最大ファイルサイズを、平均 Realm 状態サイズの倍数に設定します。 平均的な Realm 状態サイズが 10 MB の場合は、予想される使用量とデバイスの制約に応じて、最大ファイル サイズを 20 MB または 40 MB に設定できます。
開始点として、Realm ファイルサイズの 50% 以上が使用されなくなった場合に Realm を圧縮します。 現在使用されているバイトを合計ファイルサイズで割った値で、現在使用されているスペースの割合を判断します。 次に、それが 50% 未満であるかどうかを確認します。 つまり、Realm ファイル サイズの 50% 以上が未使用領域であり、圧縮に適しています。 試すと、アプリケーションに最適なパーセンテージが異なることが見つかる場合があります。