Reduzir o tamanho do arquivo Realm - .NET SDK
Nesta página
Visão geral
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
Novidades na versão 10.20.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 verificar o arquivo de Realm toda vez que ele for aberto, especificando um ShouldCompactDelegate na configuração. O seguinte exemplo de código mostra como fazer isso:
config = new RealmConfiguration() { ShouldCompactOnLaunch = (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 * the realm file */ // Compact if the file is over 100MB in size and less // than 50% 'used' var oneHundredMB = 100 * 1024 * 1024; return (totalBytes > (double)oneHundredMB) && ((double)usedBytes / totalBytes < 0.5); } }; var realm = await Realm.GetInstanceAsync(config);
Se o delegado retornar true
-- e o Arquivo de Realm não estiver em uso -- o Arquivo de Realm será compactado antes de disponibilizar a instância.
Método Realm.Compact()
Como alternativa, você pode compactar um arquivo de Realm sem primeiro obter uma instância do Realm chamando o método Compact() . O exemplo a seguir mostra como fazer isso:
config = new RealmConfiguration("my.realm"); Realm.Compact(config);
O método Compact
retornará verdadeiro se a operação for bem-sucedida.
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.
Esses cálculos podem ter a seguinte aparência em seu delegado:
// Set a maxFileSize equal to 20MB in bytes var maxFileSize = 20 * 1024 * 1024; /* Check for the realm file size to be greater than the max file size, * or the amount of bytes currently used to be less than 50% of the * total realm file size */ return (totalBytes > (double)maxFileSize) && ((double)usedBytes / totalBytes < 0.5);
Experimente as condições para encontrar o equilíbrio certo entre a frequência de compactação dos arquivos de realm em seu aplicativo.