Docs Menu
Docs Home
/ /
Administrar archivos de Realm

Reducir el tamaño del archivo Realm - SDK de Flutter

El tamaño de un dominio siempre es mayor que el tamaño total de los objetos almacenados en él. Esta arquitectura permite obtener algunas de las ventajas de rendimiento, concurrencia y seguridad del dominio.

Realm escribe datos nuevos en el espacio no utilizado registrado en un archivo. En algunas situaciones, el espacio no utilizado puede representar una parte significativa de un archivo de realm. El comportamiento predeterminado de Realm es compactar automáticamente un realm 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 0.9.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.

Si la compactación automática se considera insuficiente, se puede usar la compactación manual para las aplicaciones que requieren una gestión más estricta del tamaño de los archivos para mejorar el rendimiento. Una aplicación de producción debería implementar la compactación manual para reducir periódicamente el tamaño del archivo Realm si no utiliza la compactación automática.

Compactar un dominio puede ser una operación costosa que puede bloquear el subproceso de la interfaz de usuario. Optimice la compactación para equilibrar la frecuencia con las mejoras de rendimiento. 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.

Utilice cualquiera de las siguientes dos estrategias para compactar un archivo de reino manualmente:

  • Método estático Realm.compact(): Use este método para compactar un reino. Puede usarlo para compactar un reino de sincronización flexible.

  • Compacto condicional en abierto: utilizar el shouldCompactCallback() Cuando desee definir una o más condiciones para determinar si se compacta el dominio. Puede comprobar el tamaño de archivo del dominio, el porcentaje de espacio no utilizado u otras condiciones relevantes para sus necesidades de rendimiento o entorno de ejecución.

Puedes compactar un archivo de reino llamando a Realm.compact()Este método toma una configuración como argumento. Al usar este método, el dispositivo debe tener suficiente espacio libre para crear una copia del dominio.

Realm.compact() Obtiene una instancia del dominio y la abre para activar cualquier actualización de la versión del esquema, actualización del formato de archivo, migración y devoluciones de datos iniciales. Tras abrir correctamente el dominio y realizar estas operaciones, este método lo compacta.

Si tiene éxito, una llamada a Realm.compact() devuelve true.

No llame a este método desde una transacción. Tampoco puede compactar un dominio abierto.

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

Puedes definir shouldCompactCallback() como propiedad de la configuración de un dominio. Puedes usar esto con dominios locales y sincronizados mediante los métodos Configuration.local() y Configuration.flexibleSync(), respectivamente.

Esta devolución de llamada toma dos valores int que representan el número total de bytes y los bytes utilizados del archivo realm en el disco. La devolución de llamada devuelve un bool. La compactación solo ocurre si el bool devuelve un true y ningún otro proceso está accediendo al archivo realm.

El uso más básico es definir un tamaño de archivo en el que debe producirse la compactación.

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

Puede definir una lógica más compleja si necesita optimizar el rendimiento para diferentes casos de uso. Por ejemplo, podría establecer un umbral de compactación cuando se utiliza un porcentaje determinado del tamaño del archivo.

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

Volver

Agrupa un reino

En esta página