Realm 파일 크기 줄이기 - Kotlin SDK
시간이 지남에 따라 Realm에서 사용하는 저장 공간이 조각화되어 필요한 것보다 더 많은 공간을 차지할 수 있습니다. 내부 저장소를 재정렬하고 잠재적으로 파일 크기를 줄이려면 영역 파일을 압축해야 합니다.
Realm의 기본 동작은 Realm 파일이 너무 커지는 것을 방지하기 위해 자동으로 압축하는 것입니다. 사용 사례에 자동 압축이 충분하지 않은 경우 수동 압축 전략을 사용할 수 있습니다.
자동 압축
버전 1.6.0에 추가 되었습니다.
SDK는 파일 내 데이터를 지속적으로 재할당하고 사용하지 않는 파일 공간을 제거하여 백그라운드에서 자동으로 Realm 파일을 압축합니다. 자동 압축은 대부분의 애플리케이션에서 Realm 파일 크기를 최소화하는 데 충분합니다.
파일에서 사용되지 않은 공간이 파일의 사용자 데이터 크기의 두 배 이상일 때 자동 압축이 시작됩니다. 자동 압축은 파일에 액세스하지 않을 때만 수행됩니다.
수동 압축 옵션
수동 압축은 보다 엄격한 파일 크기 관리가 필요한 애플리케이션이나 자동 압축을 지원하지 않는 이전 버전의 SDK를 사용하는 애플리케이션에 사용할 수 있습니다.
Realm은 파일의 새 (컴팩트) 버전을 작성한 다음 원본을 새로 작성된 파일로 대체하여 파일 크기를 줄입니다. 따라서 압축하려면 원래 Realm 파일 크기와 동일한 저장 공간이 있어야 합니다.
Realm이 열릴 때마다 데이터베이스를 자동으로 압축하도록 Realm을 구성하거나 먼저 Realm 인스턴스를 가져오지 않고 파일을 압축할 수 있습니다.
Realm 구성 파일
구성에 대한 영역 함수에대한 콜백 을 설정하여 Realm 파일 을 열 때마다 Realm 파일을 압축하도록 구성할 수 있습니다. 구성을 위해 compactOnLaunch
를 호출할 때 파일 이 50 MB 이상이고 영역 파일 공간의 50% 이상이 사용되지 않은 경우 DEFAULT_COMPACT_ON_LAUNCH_CALLBACK 이 trigger 됩니다. 애플리케이션 요구 사항에 따라 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의 압축된(그리고 선택적으로 암호화된 ) 복사본을 다른 파일 위치에 저장할 수 있습니다. 대상 파일이 이미 존재할 수 없습니다.
중요
쓰기 트랜잭션( 쓰기 트랜잭션 (write transaction)) 내에서 writeCopyTo
을(를) 호출하지 마세요. 쓰기 트랜잭션( 쓰기 트랜잭션 (write transaction)) 내에서 호출하는 경우 이 메서드는 절대 최신 데이터를 복사합니다. 여기에는 이 메서드를 호출하기 전에 트랜잭션 에서 수행한 커밋되지 않은 모든 변경 사항이 포함됩니다.
Realm 수동 압축 팁
Realm을 수동으로 압축하는 것은 리소스 집약적인 작업일 수 있습니다. Realm을 열 때마다 애플리케이션이 압축되어서는 안 됩니다. 대신 압축을 최적화하여 파일 크기가 너무 커지지 않도록 애플리케이션이 충분히 자주 압축을 수행하도록 합니다. 애플리케이션이 리소스가 제한된 환경에서 실행되는 경우 특정 파일 크기에 도달하거나 파일 크기가 성능에 부정적인 영향을 미치는 경우 압축할 수 있습니다.
이러한 권장 사항은 애플리케이션에 대한 압축 최적화를 시작하는 데 도움이 될 수 있습니다.
최대 파일 크기를 평균 영역 상태 크기의 배수로 설정합니다. 평균 영역 상태 크기가 10 MB인 경우 예상 사용량과 기기 제약 조건에 따라 최대 파일 크기를 20 MB 또는 40 MB로 설정할 수 있습니다.
우선, 영역 파일 크기의 50% 이상이 더 이상 사용되지 않는 경우 영역을 압축합니다. 현재 사용 중인 바이트를 전체 파일 크기로 나누어 현재 사용 중인 공간의 비율을 확인합니다. 그런 다음 그 비율이 50% 미만인지 확인합니다. 즉, 영역 파일 크기의 50% 이상이 사용되지 않는 공간이라는 의미이므로 압축하는 것이 좋습니다. 실험을 통해 애플리케이션에 가장 적합한 비율을 찾을 수 있습니다.