Docs Menu
Docs Home
/ /
Archivos del reino

Reducir el tamaño del archivo Realm - .NET SDK

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.

Nuevo en la versión 10.20.0.

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.

La compactación manual se puede utilizar para aplicaciones que requieren una gestión más estricta del tamaño de archivo o que utilizan una versión anterior del SDK que no admite la compactación automática.

Realm reduce el tamaño del archivo escribiendo una nueva versión (compacta) y reemplazando la original con el nuevo archivo. Por lo tanto, para compactar, se requiere un espacio de almacenamiento libre equivalente al tamaño original del archivo realm.

Puede configurar el reino para compactar automáticamente la base de datos cada vez que se abre un reino, o puede compactar el archivo sin obtener primero una instancia del reino.

Puede configurar Realm para que verifique el archivo de reino cada vez que se abra especificando un ShouldCompactDelegate en la configuración. El siguiente ejemplo de código muestra cómo hacerlo:

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);

Si el delegado regresa true -- y el archivo no está en uso: el archivo de reino se compacta antes de hacer que la instancia esté disponible.

Como alternativa, puede compactar un archivo de dominio sin obtener primero una instancia del dominio mediante el método Compact(). El siguiente ejemplo muestra cómo hacerlo:

config = new RealmConfiguration("my.realm");
Realm.Compact(config);

El método Compact devolverá verdadero si la operación es exitosa.

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.

Estos cálculos podrían verse así en su 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 con las condiciones para encontrar el equilibrio adecuado entre la frecuencia con la que debe compactar los archivos de reino en su aplicación.

Volver

Agrupa un reino

En esta página