Con el tiempo, el espacio de almacenamiento que usa Realm podría fragmentarse y ocupar más espacio del necesario. Para reorganizar el almacenamiento interno y reducir el tamaño del archivo, es necesario compactar el archivo de Realm.
El comportamiento predeterminado de Realm es compactar automáticamente un archivo de reino para evitar que crezca demasiado. Puede usar estrategias de compactación manual cuando la compactación automática no sea suficiente para su caso.
Compactación automática
El SDK compacta automáticamente los archivos Realm en segundo plano reasignando continuamente los datos dentro del archivo y eliminando el espacio no utilizado. La compactación automática es suficiente para minimizar el tamaño de los archivos Realm en la mayoría de las aplicaciones.
La compactación automática comienza cuando el espacio no utilizado del archivo es más del doble del tamaño de los datos del usuario. La compactación automática solo se realiza cuando no se accede al archivo.
Opciones de compactación manual
La compactación manual se puede utilizar para aplicaciones que requieren una gestión más estricta del tamaño de los archivos.
La compactación manual de Realm funciona de la siguiente manera:
Leyendo todo el contenido del archivo del reino
Escribir el contenido en un nuevo archivo en una ubicación diferente
Reemplazar el archivo original
Si el archivo contiene muchos datos, esta puede ser una operación costosa.
El tamaño del archivo en el disco
La cantidad de espacio libre que contiene el archivo
El siguiente ejemplo muestra la configuración de las condiciones para compactar un reino si el archivo tiene más de 100 MB y se utiliza el 50% o menos del espacio en el archivo del reino.
// Create a database configuration. auto config = realm::db_config(); config.should_compact_on_launch([&](uint64_t totalBytes, uint64_t 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' auto oneHundredMB = 100 * 1024 * 1024; return (totalBytes > oneHundredMB) && (usedBytes / totalBytes) < 0.5; }); // The database is compacted on the first open if the configuration block // conditions were met. auto realm = realm::db(config);
Consejos para compactar manualmente un Realm
Compactar manualmente un dominio puede consumir muchos recursos. Su aplicación no debería compactar cada vez que abra un dominio. En su lugar, intente optimizar la compactación para que la aplicación lo haga con la frecuencia justa para evitar que el tamaño del archivo crezca demasiado. Si su aplicación se ejecuta en un entorno con recursos limitados, puede que le convenga compactar al alcanzar un tamaño de archivo determinado o cuando este afecte negativamente al rendimiento.
Estas recomendaciones pueden ayudarle a comenzar a optimizar la compactación para su aplicación:
Establezca el tamaño máximo de archivo en un múltiplo del tamaño promedio de su estado de dominio. Si el tamaño promedio de su estado de dominio es de 10MB, puede establecer el tamaño máximo de archivo en 20MB o 40MB, según el uso previsto y las limitaciones del dispositivo.
Como punto de partida, compacte los dominios cuando más del 50% del tamaño del archivo del dominio ya no esté en uso. Divida los bytes utilizados actualmente entre el tamaño total del archivo para determinar el porcentaje de espacio utilizado. Luego, verifique que sea menor al 50%. Esto significa que más del 50% del tamaño del archivo del dominio es espacio sin usar, y es un buen momento para compactar. Después de experimentar, puede que un porcentaje diferente funcione mejor para su aplicación.