¿Manera apropiada de despejar la tabla / la base de datos del reino?
Tengo un objeto del reino con ~ 30 campos, después de agregar y de quitar varios objetos parece que el reino ocupa bastante cantidad de espacio. El tamaño del espacio asignado parece crecer de manera exponencial:
10 * (agregar 100 + eliminar todo) = 4 mb Datos
- RealmResult Muchas relaciones con el adaptador
- Realm.getInstance (context) no funciona más después de la migración
- Cómo cambiar una RealmList a RealmResult?
- Realm Exception 'value' no es un objeto gestionado válido
- ¿Los modelos Realm realmente requieren getters y setters?
15 * (agregar 100 + eliminar todo) = 33 mb Datos
20 * (agregar 100 + eliminar todo) = 91 mb Datos
25 * (añadir 100 + eliminar todo) = 179 mb Datos
El archivo mismo en data \ data \ app_folder \ files \ default.realm es 200 mb en este punto.
Ahora este grave problema podría ser porque no estoy haciendo algo correctamente. Antes de cada inserción que hago
Realm realm = Realm.getInstance(context); realm.beginTransaction(); realm.where(RealmSubmission.class).findAll().clear(); // if i use realm.allObjects(RealmSubmission.class).clear(); the leak is even bigger, i get to 170mb Data with 20*(add 100 + remove all) even though both calls do the same by looking at their semantics. realm.commitTransaction();
La adición de elementos al reino se parece a esto:
for (Submission submission : submissionList){ realm.beginTransaction(); RealmSubmission realmSubmission = realm.createObject(RealmSubmission.class); RealmObjectUtils.copySubmission(realmSubmission, submission); realm.commitTransaction(); }
¿Algunas ideas?
- Realm y Comportamiento de incremento automático (Android)
- Cerrar instancia de Realm después de la ejecución
- Clase de datos Kotlin de RealmObject
- Reino que causa un montón de ANR
- Tareas del grader del reino
- Cómo crear un nuevo RealmObject que contiene una RealmList
- Reino se cierra
- Android Realm copyToRealmOrUpdate actualiza los campos existentes
He intentado replicar con una pequeña clase de modelo (una cadena, una int) sin éxito.
¿Utiliza Links y / o LinkLists en su modelo? ¿Puedo verlo?
Una razón podría ser en el caso de que tenga por ejemplo una clase Person que tiene un campo RealmListdogs. Cuando elimines todos los elementos del tipo de persona, los perros quedan retenidos en la base de datos.
EDIT: Después de proporcionar los datos que he intentado con un poco de datos ficticios:
Realm.deleteRealmFile(this); Realm realm = Realm.getInstance(this); File realmFile = new File(this.getFilesDir(), "default.realm"); long tic = System.currentTimeMillis(); for (int i = 0; i < 25; i++) { for (int j = 0; j < 100; j++) { realm.beginTransaction(); TestObject testObject = realm.createObject(TestObject.class); testObject.setApprovedBy("Approver_" + j); testObject.setAuthor("Author_" + j); testObject.setBannedBy("Banner_" + j); testObject.setClicked(j % 2 == 0); testObject.setCommentCount(j); testObject.setCreated(System.currentTimeMillis()); testObject.setCreatedUTC(j*7); testObject.setEdited(j % 3 == 0); realm.commitTransaction(); } realm.beginTransaction(); realm.where(TestObject.class).findAll().clear(); realm.commitTransaction(); Log.i(TAG, "Size: " + realmFile.length()); } long toc = System.currentTimeMillis(); Log.i(TAG, "Time: " + (toc - tic));
Pero todavía no puedo reproducir:
10-08 14:39:01.579 29233-29233/myapp.realm.io.sizeleak I/REALMTEST﹕ Size: 24576 10-08 14:39:01.999 29233-29233/myapp.realm.io.sizeleak I/REALMTEST﹕ Size: 24576 10-08 14:39:02.409 29233-29233/myapp.realm.io.sizeleak I/REALMTEST﹕ Size: 24576 10-08 14:39:02.809 29233-29233/myapp.realm.io.sizeleak I/REALMTEST﹕ Size: 24576 10-08 14:39:03.209 29233-29233/myapp.realm.io.sizeleak I/REALMTEST﹕ Size: 24576 10-08 14:39:03.649 29233-29233/myapp.realm.io.sizeleak I/REALMTEST﹕ Size: 49152 10-08 14:39:04.049 29233-29233/myapp.realm.io.sizeleak I/REALMTEST﹕ Size: 49152 10-08 14:39:04.449 29233-29233/myapp.realm.io.sizeleak I/REALMTEST﹕ Size: 49152 10-08 14:39:04.839 29233-29233/myapp.realm.io.sizeleak I/REALMTEST﹕ Size: 49152 10-08 14:39:05.329 29233-29233/myapp.realm.io.sizeleak I/REALMTEST﹕ Size: 49152 10-08 14:39:05.709 29233-29233/myapp.realm.io.sizeleak I/REALMTEST﹕ Size: 49152 10-08 14:39:06.259 29233-29233/myapp.realm.io.sizeleak I/REALMTEST﹕ Size: 49152 10-08 14:39:06.689 29233-29233/myapp.realm.io.sizeleak I/REALMTEST﹕ Size: 49152 10-08 14:39:07.109 29233-29233/myapp.realm.io.sizeleak I/REALMTEST﹕ Size: 49152 10-08 14:39:07.589 29233-29233/myapp.realm.io.sizeleak I/REALMTEST﹕ Size: 49152 10-08 14:39:08.019 29233-29233/myapp.realm.io.sizeleak I/REALMTEST﹕ Size: 49152 10-08 14:39:09.129 29233-29233/myapp.realm.io.sizeleak I/REALMTEST﹕ Size: 49152 10-08 14:39:09.729 29233-29233/myapp.realm.io.sizeleak I/REALMTEST﹕ Size: 49152 10-08 14:39:10.169 29233-29233/myapp.realm.io.sizeleak I/REALMTEST﹕ Size: 49152 10-08 14:39:10.669 29233-29233/myapp.realm.io.sizeleak I/REALMTEST﹕ Size: 49152 10-08 14:39:11.049 29233-29233/myapp.realm.io.sizeleak I/REALMTEST﹕ Size: 49152 10-08 14:39:11.449 29233-29233/myapp.realm.io.sizeleak I/REALMTEST﹕ Size: 49152 10-08 14:39:11.849 29233-29233/myapp.realm.io.sizeleak I/REALMTEST﹕ Size: 49152 10-08 14:39:12.269 29233-29233/myapp.realm.io.sizeleak I/REALMTEST﹕ Size: 49152 10-08 14:39:12.269 29233-29233/myapp.realm.io.sizeleak I/REALMTEST﹕ Time: 11265
La duplicación de tamaño se espera debido a la fragmentación, pero todavía no veo nada que pueda sugerir su experiencia.
El tiempo es alto debido al gran número de transacciones. Agruparlos juntos aumentaría considerablemente el rendimiento:
10-08 14:45:25.009 31593-31593/myapp.realm.io.sizeleak I/REALMTEST﹕ Time: 408
He hecho un método simple para eliminar el archivo de base de datos realm cuando se produce una excepción de migración (para dev). También devuelve una instancia de nuevo reino para evitar cualquier problema.
public Realm buildDatabase(){ RealmConfiguration realmConfiguration = new RealmConfiguration.Builder(this).build(); try { return Realm.getInstance(realmConfiguration); } catch (RealmMigrationNeededException e){ try { Realm.deleteRealm(realmConfiguration); //Realm file has been deleted. return Realm.getInstance(realmConfiguration); } catch (Exception ex){ throw ex; //No Realm file to remove. } } }
Debe eliminar el archivo Realm. Hasta la primera vez que use Realm no se crea ningún archivo. Eso es lo que quieres:
try { Realm.deleteRealmFile(context); //Realm file has been deleted. } catch (Exception ex){ ex.printStackTrace(); //No Realm file to remove. }
Asegúrese de que no se ha utilizado ninguna instancia de dominio.
Eliminar todos los objetos de la base de datos Realm:
realm.executeTransaction(new Realm.Transaction() { @Override public void execute(Realm realm) { realm.deleteAll(); } });
Ok viejo cosas pero de todos modos. Empecé a usar Realm en android ahora y todavía estoy comprobando, pero para experiencias pasadas usando bases de datos OO ya que las transacciones se pueden cancelar más transacciones que hacer más grande la huella que se va a dejar, con el fin de cancelar una copia del estado Debe existir, pero se está comprometiendo derecho, de mi experiencia el problema es que algunas bases de datos no descartar las transacciones de inmediato después de cometer, pero esto es detrás de la escena cosas (no puedo confirmar esto, sólo hablando de experiencias anteriores que tuve con otros OO Bases de datos donde usted podría configurar estos ajustes)
Otra cosa que noté en ambos códigos aquí es que ninguno cierra la instancia y así (también especulando) tal vez el Reino de cada transacción comprometida es no ser capaz de obtener GC
Nuevamente sólo especulando esperanza que ayuda
- MediaStore.Images.Media.insertImage devuelve null al intentar guardar la imagen
- ¿Cómo obtengo el volumen / amplitud actual en un MediaPlayer de Android?