Ormlite Android inserciones masivas

¿Alguien puede explicar por qué mis inserciones están tomando tanto tiempo en Ormlite? Hacer 1.700 inserciones en una transacción sqlite en el escritorio tarda menos de un segundo. Sin embargo, al usar Ormlite para Android, tarda unos 70 segundos, y puedo ver cada inserción en los mensajes de depuración.

Cuando intento y envuelvo los insertos en una transacción va exactamente a la misma velocidad. Entiendo que hay sobrecarga tanto para Android como para Ormlite, sin embargo, no esperaría que fuera tan grande. Mi código está abajo:

this.db = new DatabaseHelper(getApplicationContext()); dao = db.getAddressDao(); final BufferedReader reader = new BufferedReader(new InputStreamReader(getResources().openRawResource(R.raw.poi))); try { dao.callBatchTasks(new Callable<Void>() { public Void call() throws Exception { String line; while ((line = reader.readLine()) != null) { String[] columns = line.split(","); Address address = new Address(); // setup Address dao.create(address); } return null; } }); } catch (SQLException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } 

3 Solutions collect form web for “Ormlite Android inserciones masivas”

Desafortunadamente, esto puede ser "esperado". Tengo un rendimiento similar cuando hago ese número de inserciones en mi emulador también. Las tareas por lotes y desactivar la autocomisión no parecen ayudar.

Si está buscando cargar una gran cantidad de datos en una base de datos, podría considerar reproducir un volcado de base de datos en su lugar. Mira aquí:

Android OrmLite base de datos pre-poblar

He tenido el mismo problema, y ​​encontré una solución razonable. Esto tomó tiempo de inserción de 2 segundos a 150ms:

 final OrmLiteSqliteOpenHelper myDbHelper = ...; final SQLiteDatabase db = myDbHelper.getWritableDatabase(); db.beginTransaction(); try{ // do ormlite stuff as usual, no callBatchTasks() needed db.setTransactionSuccessful(); } finally { db.endTransaction(); } 

Actualizar:

Sólo probado esto en Xperia M2 Aqua (Android4.4 / ARM) y callBatchTasks() es realmente más rápido . 90ms vs 120ms. Así que pienso que más detalles están en orden.

Tenemos 3 tablas / clases / DAOs: Parent, ChildWrapper, Child.
Relaciones: Parent to ChildWrapper – 1 a n, ChildWrapper a Child – n a 1.
El código es el siguiente:

 void saveData(xml){ for (parents in xml){ parentDao.createOrUpdate(parent); for (children in parentXml){ childDao.createOrUpdate(child); childWrapperDao.createOrUpdate(generateWrapper(parent, child)); } } } 

Tengo la velocidad original en un set-top-box específico de Android4.2 / MIPS (STB). callBatchTasks fue la primera opción porque eso es lo que usamos througout todo el código y funciona bien.

 parentDao.callBatchTasks( // ... saveData(); // ... ); 

Pero los insertos eran lentos, por lo que hemos intentado anidar callBatchTasks para cada DAO utilizado, set autocommit off, startThreadConnection y probablemente otra cosa – no recuerdo en este momento. En vano.

De mi propia experiencia y otros puestos similares parece que el problema se produce cuando varias tablas / DAOs están involucrados y tiene algo que ver con las especificaciones de implementación de Android (o SQLite) para dispositivos concretos.

Mi conjetura sería que usted está frenando algo porque usted está haciendo dos tareas de IO al mismo tiempo (al menos en el código mostrado arriba). Estás leyendo desde un archivo y escribiendo en una base de datos (que es un archivo). Además, por lo que entiendo las transacciones deben ser un tamaño razonable. 1600 parece un número muy alto. Empezaría con 100 pero jugaría con el tamaño.

Así que esencialmente le sugiero "chunk" sus lecturas e inserciones.

Lea 100 líneas a una matriz temporal, luego inserte esa 100. Luego lea las 100 siguientes, luego inserte, etc.

  • ¿El yieldIfContendedSafely () pierde los beneficios de una transacción?
  • ¿Cómo obtengo el mejor rendimiento con SQLite en Android?
  • La transacción de Firebase no aborta remotamente si previamente se ha comprometido localmente
  • ¿Está bien actualizar fragmentos en lugar de crear nuevas instancias?
  • Android: niveles de aislamiento de transacciones SQLite (ORMLite)
  • Administrador de paquetes de Android ha muerto con TransactionTooLargeException
  • Fragmento no se muestra cuando el método add () se llama
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.