Realm 파일 크기 줄이기 - Flutter SDK
영역의 크기는 항상 그 안에 객체 데이터베이스의 전체 크기보다 큽니다. 이 아키텍처는 Realm의 일부 성능, 동시성 및 안전상의 이점을 지원합니다.
Realm은 파일 내에서 추적된 미사용 공간에 새 데이터를 씁니다. 경우에 따라 사용하지 않는 공간이 Realm 파일의 상당 부분을 차지할 수 있습니다. Realm의 기본 동작은 영역이 너무 커지는 것을 방지하기 위해 자동으로 압축하는 것입니다. 사용 사례에 자동 압축이 충분하지 않은 경우 수동 압축 전략을 사용할 수 있습니다.
자동 압축
버전 0.9.0에 추가 되었습니다.
SDK는 파일 내 데이터를 지속적으로 재할당하고 사용하지 않는 파일 공간을 제거하여 백그라운드에서 자동으로 Realm 파일을 압축합니다. 자동 압축은 대부분의 애플리케이션에서 Realm 파일 크기를 최소화하는 데 충분합니다.
파일에서 사용되지 않은 공간이 파일의 사용자 데이터 크기의 두 배 이상일 때 자동 압축이 시작됩니다. 자동 압축은 파일에 액세스하지 않을 때만 수행됩니다.
수동 압축 전략
자동 압축이 충분하지 않다고 판단되는 경우 성능 향상을 위해 파일 크기를 더 엄격하게 관리해야 하는 애플리케이션에 수동 압축을 사용할 수 있습니다. 프로덕션 애플리케이션은 자동 압축을 사용하지 않는 경우 수동 압축을 구현하여 주기적으로 영역 파일 크기를 줄여야 합니다.
영역 압축은 UI 스레드를 차단할 수 있는 비용이 많이 드는 작업일 수 있습니다. 압축을 최적화하여 빈도와 성능 향상의 균형을 맞춥니다. 애플리케이션이 리소스가 제한된 환경에서 실행되는 경우 특정 파일 크기에 도달하거나 파일 크기가 성능에 부정적인 영향을 미칠 때 압축할 수 있습니다.
다음 두 가지 전략 중 하나를 사용하여 Realm 파일을 수동으로 압축합니다:
Realm.compact() 정적 메서드: Realm을 압축하려면 이 메서드를 사용합니다. 이를 사용하여 Flexible Sync Realm을 압축할 수 있습니다.
열 때 조건부 압축: 영역 을 압축할지 여부를 결정하기 위해 하나 이상의 조건을 정의하려는 경우
shouldCompactCallback()
를 사용합니다. 특정 영역 파일 크기, 사용하지 않는 공간의 비율 또는 성능 요구 사항 또는 런타임 환경과 관련된 기타 조건을 확인할 수 있습니다.
Realm.compack() 정적 메서드
Realm 영역( ) 을(를) 호출하여 Realm 파일 을 압축할 수 있습니다. . 이 메서드는 구성 이 필요합니다. 를 인수로 사용합니다. 이 방법을 사용할 때는 기기에 영역 의 복사본을 만들 수 있는 충분한 여유 공간이 있어야 합니다.
Realm.compact()
영역의 인스턴스를 가져오고 이를 열어 스키마 버전 업그레이드, 파일 형식 업그레이드, 마이그레이션 및 초기 데이터 콜백을 trigger합니다. 영역을 성공적으로 열고 이러한 작업을 수행하면 이 메서드가 영역을 압축합니다.
성공하면 호출은 Realm.compact()
true
을 반환합니다.
트랜잭션 내부에서 이 메서드를 호출하지 마세요. 또한 열린 영역을 압축할 수도 없습니다.
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);
열 때 조건부 압축
shouldCompactCallback() Realm 구성의 속성으로 사용됩니다. Configuration.local() 메서드를 사용하여 로컬 전용 영역과 동기화 영역 모두에서 이 기능을 사용할 수 있습니다. 및 Configuration.flexibleSync() 메서드를 호출합니다.
이 콜백은 디스크에 있는 영역 파일의 총 바이트 수와 사용된 바이트를 나타내는 두 개의 int
값을 사용합니다. 콜백이 bool
을 반환합니다. 압축은 bool
가 true
을 반환하고 다른 프로세스가 현재 영역 파일에 액세스하고 있지 않은 경우에만 발생합니다.
가장 기본적인 사용법은 압축이 수행되어야 하는 파일 크기를 정의하는 것입니다.
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);