Reduzir o tamanho do Arquivo de Realm - Flutter SDK
Nesta página
O tamanho de um Realm é sempre maior que o tamanho total do banco de dados de objetos dentro dele. Essa arquitetura permite alguns dos benefícios de desempenho, simultaneidade e segurança do realm.
O Realm escreve novos dados em espaços livres já monitorados dentro de um arquivo. Em certos casos, o espaço não utilizado pode incluir uma parte significativa de um Arquivo de Realm. Por padrão, o Realm compacta automaticamente um realm para impedir que ele se torne excessivamente grande. Você pode usar técnicas de compactação manual se a compactação automática não for suficiente para o seu caso de uso.
Compactação automática
Novidade na versão 0.9.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.
Estratégias de compactação manual
Se a compactação automática for considerada insuficiente, a compactação manual poderá ser usada para aplicativos que exigem um gerenciamento mais rigoroso do tamanho do arquivo para melhorar o desempenho. Uma aplicação de produção deve implementar a compactação manual para reduzir periodicamente o tamanho do Arquivo de Realm se ele não usar a compactação automática.
A compactação de um Realm pode ser uma operação cara que pode bloquear o thread da UI. Otimize a compactação para equilibrar a frequência com ganhos de desempenho. Se a sua aplicação for executada 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 impacto negativamente o desempenho.
Use uma das duas estratégias a seguir para compactar um Arquivo de Realm manualmente:
Método estático Realm.compact() : Use este método para compactar um domínio. Você pode usar isso para compactar um domínio Flexible Sync.
Compactar condicionalmente na abertura: use o
shouldCompactCallback()
quando quiser definir uma ou mais condições para determinar se o Realm deve ser compactado . Você pode verificar um determinado tamanho de arquivo de Realm , uma porcentagem de espaço não utilizado ou outras condições relevantes para suas necessidades de desempenho ou ambiente de tempo de execução.
Método estático Realm.compact()
Você pode compactar um arquivo de Realm chamando Realm.compact(). Esse método usa uma configuração como argumento. Ao usar esse método, o dispositivo deve ter espaço livre suficiente para fazer uma cópia do Realm.
Realm.compact()
obtém uma instância do domínio e a abre para acionar quaisquer atualizações de versão do esquema, atualizações de formato de arquivo, migração e retornos de chamada de dados iniciais. Após abrir com sucesso o domínio e executar essas operações, esse método compacta o domínio.
Se for bem-sucedida, uma chamada para Realm.compact()
retornará true
.
Não chame este método de dentro de uma transação. Você também não pode compactar um Realm aberto.
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);
Condicionalmente Compacto no Aberto
Você pode definir um shouldCompactCallback() como uma propriedade da configuração de um realm. Você pode usar isso com domínios somente locais e sincronizados com o método Configuration.local() e Configuration.flexibleSync() métodos, respectivamente.
Esta chamada de resposta obtém dois valores int
que representam o número total de bytes e os bytes usados do Arquivo de Realm no disco. A chamada de resposta retorna um bool
. A compactação só ocorre se o bool
retornar true
e outro processo não estiver acessando o Arquivo de Realm no momento.
O uso mais básico é definir um tamanho de arquivo no qual a compactação deve ocorrer.
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);
Você pode definir uma lógica mais complexa se precisar otimizar o desempenho para diferentes casos de uso. Por exemplo, você pode definir um limite para compactação quando uma determinada porcentagem do tamanho do arquivo é usada.
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);