Realm ファイルのサイズ縮小 - Flutter SDK
Realm のサイズは、その中に保存されているオブジェクトの合計サイズよりも常に大きくなります。 このアーキテクチャでは、Realm のパフォーマンス、同時実行性、および安全性の利点の一部が有効になります。
Realm は、ファイル内で追跡される未使用のスペース内に新しいデータを書込みます。 状況によっては、未使用の領域が Realm ファイルの大部分を構成することがあります。 Realm のデフォルトの動作は、Realm が大きくなりすぎるのを防ぐために自動的に圧縮することです。 自動圧縮がユースケースに十分でない場合は、手動圧縮戦略を使用できます。
自動圧縮
バージョン 0.9.0 の新機能。
SDK は、ファイル内のデータを継続的に再割り当てし、未使用のファイル領域を排除することで、Realm ファイルをバックグラウンドで自動的に圧縮します。 自動圧縮は、ほとんどのアプリケーションの Realm ファイル サイズを最小限に抑えるのに十分です。
自動圧縮は、ファイル内の未使用領域のサイズがファイル内のユーザー データのサイズの 2 倍を超えると開始されます。 自動圧縮は、ファイルがアクセスされていない場合にのみ行われます。
手動圧縮戦略
自動圧縮が不十分と判断された場合は、パフォーマンスを向上させるためにファイルサイズをより厳密に管理する必要があるアプリケーションに、手動圧縮を使用できます。 実稼働アプリケーションでは、自動圧縮を使用しない場合は、手動圧縮を実装して Realm ファイルのサイズを定期的に縮小する必要があります。
Realm を圧縮すると、UI スレッドがブロックされる可能性があり、コストのかかる操作になる可能性があります。 頻度とパフォーマンスの向上のバランスを保つために、圧縮を最適化します。 アプリケーションがリソースが制限された環境で実行されている場合、一定のファイルサイズに達したときや、ファイルサイズがパフォーマンスに悪影響を及ぼす場合は、圧縮する必要がある場合があります。
Realm ファイルを手動で圧縮するには、次の 2 つの方法のいずれかを使用します。
Realm.comact()静的メソッド: このメソッドを使用して Realm を圧縮します。 これを使用して、Flexible Sync レルムを圧縮できます。
オープン で条件付きで圧縮されます。Realm を圧縮するかどうかを判断するための 1 つ以上の条件を定義する場合は、
shouldCompactCallback()
を使用します。 特定の Realm ファイル サイズ、未使用領域の割合、またはパフォーマンス ニーズやランタイム環境に関連するその他の条件を確認できます。
Realm.comact() 静的メソッド
Realm 邦土( ) を呼び出すことで、Realmファイルを圧縮できます 。このメソッドは 構成 を取得します 引数として。このメソッドを使用する場合、デバイスには Realm のコピーを作成するための十分な空き邦土が必要です。
Realm.compact()
は、Realm のインスタンスを取得し、それを開いてスキーマ バージョンのアップグレード、ファイル形式のアップグレード、移行、および初期データのコールバックをtriggerします。 Realm を正常に開き、これらの操作を実行すると、このメソッドは Realm を圧縮します。
成功した場合、 への呼び出しはRealm.compact()
true
を返します。
トランザクション内からこのメソッドを呼び出しないでください。 開いている Realm を圧縮することもできません。
final config = Configuration.local([Car.schema]); final compacted = Realm.compact(config); print( "Successfully compacted the realm: $compacted"); // On success, this prints "true" final realm = Realm(config);
オープンで条件付きで圧縮
ShouldCompatCallback() を定義できます Realm の構成のプロパティとして。これは、 Configuration.local() メソッドを使用して、ローカル専用と同期された Realm の両方で使用できます および Configuration.FlexibleSync() それぞれのメソッドを使用します。
このコールバックは、ディスク上の Realm ファイルの合計バイト数と使用済みバイト数を表す 2 つのint
値を受け取ります。 コールバックではbool
が返されます。 圧縮は、 bool
がtrue
を返し、別のプロセスが現在 Realm ファイルにアクセスしていない場合にのみ発生します。
最も基本的な用途は、圧縮が行われるファイル サイズを定義することです。
final config = Configuration.local([Car.schema], shouldCompactCallback: ((totalSize, usedSize) { // shouldCompactCallback sizes are in bytes. // For convenience, this example defines a const // representing a byte to MB conversion for compaction // at an arbitrary 10MB file size. const tenMB = 10 * 1048576; return totalSize > tenMB; })); final realm = Realm(config);
さまざまなユースケースに合わせてパフォーマンスを最適化する必要がある場合は、より複雑なロジックを定義できます。 たとえば、ファイル サイズの特定の割合が使用された場合に、圧縮のしきい値を設定できます。
final config = Configuration.local([Car.schema], shouldCompactCallback: ((totalSize, usedSize) { // Compact if the file is over 10MB in size and less than 50% 'used' const tenMB = 10 * 1048576; return (totalSize > tenMB) && (usedSize.toDouble() / totalSize.toDouble()) < 0.5; })); final realm = Realm(config);