Realm es un motor de bases de datos nacido con la intención de sustituir a SQLite o Core Data (iOS), para implementar bases de datos de manera sencilla en aplicaciones desarrolladas con Android y en el sistema iOS. Realm propone un modelo de bases de datos orientada a objetos compatible con ACID.

El diseño de Realm evita hacer uso de ORMs para la realización fácil de consultas, la propia implementación de este sistema posibilita el acceso a consultas de manera similar a como la implementan los ORMs existentes. Un ejemplo de consulta se muestra debajo.

 RealmResults result = realm.where(Usuario.class)
                                 .greaterThan("edad", 12)  
                                 .beginGroup()
                                      .equalTo("name", "Pedro")
                                      .or()
                                      .contains("name", "Pep")
                                 .endGroup()
                                 .findAll();

Análisis de rendimiento entre SQLite y Realm

Para verificar si Realm es una solución más adecuada que SQLite se proponen a continuación un conjunto de pruebas que fueron realizadas a ambos sistemas.

Pruebas realizadas:

  • Verificación del comportamiento ante la inserción de elementos en diferentes cantidades (1, 10, 100, 1000 y 10000).

  • Verificación del comportamiento ante la selección de elementos en diferentes cantidades (1, 10, 100, 1000, 10000).

  • Verificación del espacio ocupado en memoria física ante las operaciones anteriores.

Escenario de pruebas

El escenario de pruebas propuesto tuvo las características siguientes:

  • Las pruebas se hicieron sobre el sistema operativo NovaDroid (Basado en 4.4.2 KitKat).

  • Las características del teléfono (Nut Neko) fueron:

    • Microprocesador: 1GHz.

    • RAM: 1GB.

    • Memoria interna: 4GB.

  • El desarrollo de la aplicación fue realizada con Android Studio ejecutándose sobre Nova Linux 5.0 amd64.

  • Se empleó la librería nativa de SQLite disponible en la SDK 24.0 (versión para Linux, sin emplear ORMs).

  • Para las pruebas de Realm se empleó la versión 0.80.3 (disponible1).

Fue desarrollada una pequeña aplicación para almacenar datos asociados a un paquete de software, los datos a guardar son:

Campo

Tipo

Identificador

Cadena (UUID)

Nombre

Cadena

Autor

Cadena

Tamaño

Entero

Tabla 1: Estructura de la tabla para la base de datos de prueba.

Empleando la marca de tiempo (timestamp) se midió el tiempo de ejecución de los procesos de inserción y selección de datos tomando como resultado la diferencia. El uso del procesador durante la ejecución de las operaciones fue observado empleando la herramienta OS Monitor disponible para Android.

Antes de realizar cada prueba como metodología de trabajo se borraba la caché de la aplicación, se desinstalaba la misma y se liberaban los procesos que se ejecutaban en el teléfono.

Prueba de operaciones de inserción de datos

Los tiempos dedicados a las operaciones de inserción de datos se muestran en la siguiente tabla.

Cantidad de tuplas

SQLite

Realm

Realm-SQLite

1

46

38

– 8

10

159

86

-73

100

1273

629

– 644

1000

12470

8521

– 3949

10000

115079

89933

– 25146

Tabla 2: Operaciones de inserción de datos.

1

Independientemente a que en un dispositivo inteligente como un teléfono o un tablet no se realizan operaciones masivas de grandes inserciones de datos simultaneas, hay escenarios en que este proceso pudiera tener lugar, por ejemplo supongamos la importación de una lista de contactos muy grande desde una determinada fuente de datos, o que nos conectamos por primera vez a una tienda de aplicaciones online y necesitamos crear un sistema con los datos de las aplicaciones disponibles en la tienda para tener referencias a todas ellas, entre otros. Los escenarios pueden ser disímiles.

Teniendo en cuenta que por lo general estos dispositivos no poseen grandes volúmenes de almacenamiento, resulta interesante revisar el espacio en memoria física ocupado por los archivos de bases de datos respectivos creados.

Teniendo en cuenta que por lo general estos dispositivos no poseen grandes volumenes de almacenamiento, resulta interesante revisar el espacio en memoria física ocupado por los archivos de bases de datos respectivos creados.

Cantidad de tuplas

SQLite

Realm

Realm-SQLite

100

62K

48K

-14K

1000

476K

384K

-92K

Tabla 3: Espacio ocupado para la misma cantidad de registros.

Fueron elegidos solamente las cantidades de 100 y 1000 tuplas, pues se consideran suficientes para poder obtener un factor de crecimiento para registros de tipo similar.

Durante este proceso fue verificado también el uso del procesador del teléfono objeto del escenario de pruebas mientras se ejecutaban las operaciones de inserción de 1000 y 10000 registros, para el caso de SQLite, independientemente a estar nativo dentro del conjunto de librerías del dispositivo se pudo constatar que el uso del proceso que ejecutaba la operación oscilaba entre un 19%~35%, mientras con Realm el comportamiento estuvo dentro de 14%~21%.

Prueba de selección masiva de datos

Luego de usar aplicaciones desarrolladas como ETECSADroid o Wikipedia offline que disponen bases de datos SQLite con contenido estático de solo consulta y cuyo comportamiento en ocasiones es lento, resulta necesario revisar los tiempos de respuesta ante consultas por uno y otro gestor.

Cantidad de tuplas

SQLite

Realm

Realm-SQLite

1

4

1

-3

10

6

2

-4

100

8

2

-6

1000

44

3

-39

10000

464

8

-456

Tabla 4: Operaciones de selección de datos.

2

Luego de revisar el gráfico de la figura anterior es necesario realizar un pequeño análisis de los tiempos.

En el caso de SQLite emplea el modelo relacional, lo que implica que a la hora de obtener los registros los mismos pueden ser obtenidos de diferentes formas, pero básicamente el resultado se expresa en forma llave => valor, donde la llave es el identificador de la columna (nombre o número correspondiente) en la base de datos y el valor es el resultado correspondiente a la tupla en cuestión.

Luego de mapeado con Android se obtiene un cursor que permite moverse por los resultados y de que cada tupla obtener los valores y crear un objeto correspondiente con que el que se trabaja en nuestra aplicación.

Sin embargo, al ser Realm un gestor orientado a objetos el proceso de consulta es prácticamente inmediato, devolviendo casi de manera instantánea una lista de los objetos almacenados.

Consideraciones finales

Luego de evaluar ambos sistemas de bases de datos se considera que:

  • La tecnología que emplea Realm es potencialmente más eficiente que SQLite en los procesos de inserción de datos, selección masiva de tuplas, optimización en el uso del procesador y en el espacio de memoria física ocupado.

  • El empleo de SQLite por parte de Google como motor de bases de datos predeterminado para Android obedece en nuestra consideración a varios elementos:

    • El manejo de bases de datos relacionales es más común entre desarrolladores que las bases de datos orientadas a objetos.

    • Realm nace posterior al surgimiento de Android y actualmente no tiene libería para el acceso directo desde el lenguaje C que posibilite su inclusión en la capa de librerías de Android. Solo está disponible en Java, Swift y Objective C (para iOS).

  • Antes de desarrollar una nueva aplicación para Android debe considerarse usar Realm, es más sencillo de usar y posee tiempos de respuesta mejor que los disponibles en SQLite, independientemente a ser un proyecto nuevo, posee madurez y variados casos de éxito.

  • Realm posee dos limitaciones importantes:

    • No se pueden almacenar en bases de datos tipos enumerativos (Enum).

    • No existe un browser o visor que permita gestionar las bases de datos como sqlitebrowser (para SQLite) y otros.

RealmDemo-master.zip (132 descargas)

1https://static.realm.io/downloads/java/realm-java-0.80.3.zip

La imagen de portada fue tomada de: mobilefirstcloudfirst.net