Reduzir o tamanho do arquivo de domínio - Realm Kotlin SDK
Nesta página
Com o tempo, o espaço de armazenamento usado pelo Realm pode ficar fragmentado e ocupar mais espaço do que o necessário. Para reorganizar o armazenamento interno e potencialmente reduzir o tamanho do arquivo, o arquivo de domínio precisa ser compactado.
Por padrão, o Realm compacta automaticamente arquivos de realm para impedir que eles se tornem excessivamente grandes. Você pode usar técnicas de compactação manual se a automática for insuficiente para o seu caso de uso.
Compactação automática
Novidade na versão 1,6,0.
O SDK compacta automaticamente os arquivos do Realm em segundo plano, realocando continuamente os dados no arquivo e removendo o espaço de arquivo não utilizado. A compactação automática é suficiente para minimizar o tamanho do arquivo Realm para a maioria dos aplicativos.
A compactação automática é acionada quando o tamanho do espaço não utilizado do arquivo excede o dobro do tamanho dos dados do usuário contidos no arquivo. A compactação automática só ocorre quando o arquivo não está sendo acessado.
Opções manuais de compactação
A compactação manual pode ser usada para aplicativos que exigem um gerenciamento mais rigoroso do tamanho do arquivo ou que usam uma versão mais antiga do SDK que não permite a compactação automática.
O Realm reduz o tamanho do arquivo gravando uma nova versão (compacta) do arquivo e, em seguida, substituindo o original pelo arquivo recém-escrito. Portanto, para compactar, você deve ter espaço de armazenamento livre equivalente ao tamanho do arquivo original do domínio.
Você pode configurar o realm para compactar automaticamente o banco de dados sempre que um realm for aberto, ou pode compactar o arquivo sem primeiro obter uma instância do realm.
Arquivo de configuração do Realm
Você pode configurar o Realm para compactar o arquivo de Realm toda vez que ele for aberto definindo um chamada de resposta de chamada de resposta para a função compactOnLaunch para a configuração. Quando você chama compactOnLaunch
para a configuração, o DEFAULT_COMPact_ON_LAUNCH_CALLBACK será trigger se o arquivo estiver acima de 50 MB e 50% ou mais do espaço no arquivo de Realm não estiver sendo usado. Você pode especificar configurações de compactação personalizadas ao chamar compactOnLaunch
, dependendo das necessidades do seu aplicativo. O seguinte exemplo de código mostra como fazer isso:
// 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)
Método Realm.compactRealm
Como alternativa, você pode compactar um arquivo de domínio sem precisar abri-lo chamando o método compactRealm :
val config = RealmConfiguration.create(schema = setOf(Item::class)) var compacted = Realm.compactRealm(config)
O método compactRealm
retornará verdadeiro se a operação for bem-sucedida e falso caso contrário.
Importante
compactRealm não está disponível no Windows (JVM) e lançará um NotImplementedError lá.
Fazer uma cópia compactada
Você pode salvar uma cópia compactada (e, opcionalmente, criptografada) de um domínio para outro local de arquivo com o método Realm.writeCopyTo . O arquivo de destino ainda não pode existir.
Importante
Evite ligar para writeCopyTo
em uma transação de gravação. Se for chamado em uma transação de gravação, esse método copiará os dados absolutamente mais recentes. Isso inclui todas as alterações não confirmadas que você fez na transação antes dessa chamada de método.
Dicas para compactar manualmente um Realm
A compactação manual de um realm pode ser uma operação que consome muitos recursos. Seu aplicativo não deve ser compactado toda vez que você abrir um realm. Em vez disso, tente otimizar a compactação para que seu aplicativo faça isso com frequência suficiente para evitar que o tamanho do arquivo fique muito grande. Se o seu aplicativo for executado em um ambiente com restrição de recursos, você pode querer compactar quando chegar a um determinado tamanho de arquivo ou quando o tamanho do arquivo afetar negativamente o desempenho.
Essas recomendações podem ajudá-lo a começar a otimizar a compactação de seu aplicativo:
Defina o tamanho máximo do arquivo como um múltiplo do tamanho médio do estado do Realm. Se o estado médio do Realm for de 10MB, defina o tamanho máximo do arquivo Realm entre 20MB e 40MB, considerando o uso previsto e as restrições do dispositivo.
Como ponto de partida, os domínios compactos quando mais de 50% do tamanho do arquivo de área não estão mais em uso. Divida os bytes atualmente usados pelo tamanho total do arquivo para determinar a porcentagem de espaço que está sendo usada atualmente. Em seguida, verifique se é inferior a 50%. Isso significa que mais de 50% do tamanho do arquivo do seu realm é espaço não utilizado e é um bom momento para compactar. Após a experimentação, você pode descobrir que uma porcentagem diferente funciona melhor para seu aplicativo.