Estoy insertando 150000 objetos en realm db. El objeto tiene solo una propiedad que es una cadena. Al mismo tiempo, estoy creando un generador de cadenas con una nueva línea para cada cadena y finalmente lo escribo en un archivo de texto.

Al final, el tamaño del archivo de texto es 0,8 MB. Donde el tamaño de la base de datos del reino es 18mb. ¿Cuál es la causa? Cómo minimizar el tamaño de la base de datos del reino. ¿Me puedes dirigir por favor? Aquí está el código de inserción del reino

private void insertWord() {
    long time = System.currentTimeMillis();
    StringBuilder builder=new StringBuilder();

    RealmConf conf = RealmConf.getInstance(true);
    int i = 0;
    RealmUtils.startTransaction(conf);


    while (i < 150000) {
        i++;
        String word = "Word:" + i;
        EB eb = new EB(word);
        builder.append(word+"\n");

        RealmUtils.saveWord(eb, conf);
        Log.i("word check" + i++, "seelog:" + word);
    }
    RealmUtils.commitTransaction(conf);
    writeStringIntoFile(builder.toString(),0);
}
4
shihab uddin 14 feb. 2018 a las 11:39

2 respuestas

La mejor respuesta

Podrías probar lo siguiente, para la ciencia:

private void insertWord() {
    long time = System.currentTimeMillis();
    StringBuilder builder=new StringBuilder();

    RealmConf conf = RealmConf.getInstance(true);
    int i = 0;
    int batchCount = 0;


    while (i < 150000) {
        if(batchCount == 0) {
            RealmUtils.startTransaction(conf);
        }
        batchCount++
        i++;
        String word = "Word:" + i;
        EB eb = new EB(word);
        builder.append(word+"\n");

        RealmUtils.saveWord(eb, conf);
        Log.i("word check" + i++, "seelog:" + word);
        if(batchCount == 3000) {
            RealmUtils.commitTransaction(conf);
            batchCount = 0;
        }
    }
    if(batchCount != 0) {
        RealmUtils.commitTransaction(conf);
    }
    writeStringIntoFile(builder.toString(),0);
}
1
EpicPandaForce 14 feb. 2018 a las 13:17

Probablemente porque olvidó llamar a Realm.close(). Consulte este documento para obtener más detalles.

https://realm.io/docs/java/latest/#faq

Tamaño de archivo de Realm grande Debe esperar que una base de datos de Realm ocupe menos espacio en el disco que una base de datos SQLite equivalente, pero para brindarle una vista coherente de sus datos, Realm opera en múltiples versiones de un Realm. Esto puede hacer que el archivo Realm crezca de manera desproporcionada si la diferencia entre la versión más antigua y la más nueva de los datos aumenta demasiado.

Realm eliminará automáticamente las versiones anteriores de los datos si ya no se utilizan, pero el tamaño real del archivo no disminuirá. El espacio adicional se reutilizará en futuras escrituras.

Si es necesario, el espacio adicional se puede eliminar compactando el archivo Realm. Esto se puede hacer de forma manual o automática al abrir el Reino por primera vez.

Si está experimentando un aumento inesperado del tamaño del archivo, generalmente ocurre por una de dos razones:

1) Abres un Reino en un hilo en segundo plano y olvidas cerrarlo de nuevo.

Esto hará que Realm retenga una referencia a los datos en el hilo de fondo y es la causa más común de problemas de tamaño de archivo de Realm. La solución es asegurarse de cerrar correctamente su instancia de Realm. Lee más aquí y aquí. Realm detectará si olvidó cerrar una instancia de Realm correctamente e imprimirá una advertencia en Logcat. Los subprocesos con bucles, como el subproceso de la interfaz de usuario, no tienen este problema.

2) Usted lee algunos datos de un Reino y luego bloquea el hilo en una operación de larga duración mientras escribe muchas veces en el Reino en otros hilos.

Esto hará que Realm cree muchas versiones intermedias que necesitan ser rastreadas. Evitar este escenario es un poco más complicado, pero por lo general se puede hacer ya sea agrupando las escrituras o evitando tener el Reino abierto mientras se bloquea el hilo en segundo plano.

0
Kumar Bibek 14 feb. 2018 a las 08:47