¿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

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

imagen

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?

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

  • Cómo cerrar el reino abierto por Realm.getDefaultInstance?
  • Android Realm copyToRealmOrUpdate crea duplicados de objetos anidados
  • El método findFirst () del dominio devuelve null
  • Realm Query es posible usar IN?
  • Realm con datos pre-poblados en activos?
  • Realm.io - ¿Es posible encontrar objeto por su subobjeto?
  • Utilice bases de datos pre-pobladas con Realm
  • ¿Cómo puedo crear una base de datos Realm con datos iniciales para mi aplicación android?
  • ¿RealmBaseAdapter se ha eliminado de realm-java?
  • Cómo hacer una copia de seguridad de Realm DB en Android antes de eliminar el archivo Realm. ¿Hay alguna manera de restaurar el archivo de copia de seguridad?
  • ¿Cómo comprobar el reino para la existencia de los datos del androide?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.