Necesito analizar un archivo XML bastante grande (que varía entre unos cien kilobytes y varios cientos de kilobytes), que estoy usando Xml#parse(String, ContentHandler)
. Actualmente estoy probando esto con un archivo de 152 KB.
Durante el análisis, también insertar los datos en una base de datos SQLite utilizando llamadas similares a lo siguiente: getWritableDatabase().insert(TABLE_NAME, "_id", values)
. Todo esto en conjunto toma aproximadamente 80 segundos para el archivo de prueba de 152 KB (que se reduce a insertar aproximadamente 200 filas).
Cuando comento todas las declaraciones de inserción (pero dejo todo lo demás, como crear, ContentValues
etc.), el mismo archivo toma solo 23 segundos.
¿Es normal que las operaciones de la base de datos tengan una sobrecarga tan grande? ¿Puedo hacer algo al respecto?
Dado que InsertHelper mencionado por Yuku y Brett está obsoleto ahora (nivel de API 17), parece que la alternativa correcta recomendada por Google es usar SQLiteStatement .
Usé el método de inserción de la base de datos como este:
Después de que también experimenté algunos problemas serios de rendimiento, el siguiente código aceleró mis 500 inserciones de 14.5 segundos a solo 270 ms , ¡increíble!
Así es como usé SQLiteStatement:
fuente
Compilar la declaración de inserción de SQL ayuda a acelerar las cosas. También puede requerir más esfuerzo apuntalar todo y evitar una posible inyección, ya que ahora está todo sobre sus hombros.
Otro enfoque que también puede acelerar las cosas es la clase android.database.DatabaseUtils.InsertHelper poco documentada. Tengo entendido que en realidad envuelve declaraciones de inserción compiladas. Pasar de inserciones con transacciones no compiladas a inserciones con transacciones compiladas fue aproximadamente una ganancia de 3 veces en la velocidad (2ms por inserción a .6ms por inserción) para mis inserciones grandes (200K + entradas) pero simples de SQLite.
Código de muestra:
fuente
Si la tabla tiene un índice, considere eliminarlo antes de insertar los registros y luego volver a agregarlo después de haber confirmado sus registros.
fuente
Si usa un ContentProvider:
Luego, la función privada para realizar la inserción (aún dentro de su proveedor de contenido):
fuente