Menu Docs
Página inicial do Docs
/ /
Atlas Device SDKs
/ /

Reduzir o tamanho do arquivo Realm - SDK do Node.js

Nesta página

  • Compactação automática
  • Opções manuais de compactação
  • Arquivo de configuração do Realm
  • Método Realm.compact()
  • Fazer uma cópia compactada
  • Dicas para compactar manualmente um Realm

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.

Novo na versão 11,3,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.

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.

Você pode configurar o Realm para verificar o arquivo de Realm toda vez que ele for aberto, especificando uma função shouldCompact para a configuração. O seguinte exemplo de código mostra como fazer isso:

const shouldCompact = (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 100MB in size and less than 50% 'used'
const oneHundredMB = 100 * 1024 * 1024;
return totalBytes > oneHundredMB && usedBytes / totalBytes < 0.5;
};
const config = { shouldCompact };
let realm = await Realm.open(config);

Como alternativa, você pode compactar um arquivo de Realm sempre que quiser, chamando o método compact() :

const realm = new Realm("my.realm");
try {
const compactSuccess = realm.compact();
} catch (err) {
if (err instanceof Error) {
// handle error for compacting
}
}

O método compact() retornará verdadeiro se a operação for bem-sucedida.

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() método. 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.

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:

// Set a maxFileSize equal to 20MB in bytes
const maxFileSize = 20 * 1024 * 1024;
/* Check for the realm file size to be greater than the max file size,
* and 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.

Voltar

Abrir e fechar um realm