Информация об изменениях

Сообщение Ускорить вставку в Android SQLite от 23.02.2019 14:57

Изменено 23.02.2019 14:59 halo

(ошибочное предположение об ошибке)

Посоветуйте, что нужно сделать, чтобы ускорить работу с SQLite в Android
Здравствуйте.

Пишу на Java модуль импорта данных с простого источника в SQLite базу данных. Модуль по сути занимается тем, что расбирает CSV и переливает его в базу. Количество записей в тестовом источнике порядка 700К и каждую из этих записей нужно сохранить в чистую базу данных. Количество таблиц — 13. Каждая из таблиц может иметь от 3 до 12 столбцов. Количество же строк для каждой таблицы может варьироваться от нуля к нескольким ста тысячам (в особенности для таблиц пошире).

Есть прототипы под JRE и под Android. Поковырявшись с JRE и JDBC, довольно просто добился весьма приемлемых результатов в несколько секунд с помощью пакетной обработки (addBatch + executeBatch). В Android альтернативная реализация занимает очень много времени (где-то 60 с) и пока, надеюсь не окончательный, использует следующий подход:

* исполнении всех INSERT-операторов в рамках одной транзакции (я так понял, это вообще стандартная идиома в Android: beginTransaction(), n x executeInsert(), setForeignKeyConstraintsEnabled(false), setTransactionSuccessful(), endTransaction());
* "пакетировании" записей в динамически формируемом INSERT-операторе (например, 83 записи в одном INSERT для самой широкой таблицы, потому что SQLite ограничивает количество переменных 999-ью (999 div 12 = 83));
* кеширование скомпилированных динамических операторов в локальном кеше (compileStatement(...) + Guava loading cache).

Интересует следующее:

1) Что нужно изменить, чтобы хоть как-то сократить время импорта?
2) Может, есть способ заливать данные в базу напрямую в обход API? Что-то типа как LOAD DATA INFILE в MySQL. .import в консоли является, я так понимаю, просто обёрткой над множетсвенными INSERT-ами.
3) Оказаться от штатных средств Android или вообще попробовать другую (Р)СУБД?

Спасибо.
sqlite3 android bulk insert
Посоветуйте, что нужно сделать, чтобы ускорить работу с SQLi
Здравствуйте.

Пишу на Java модуль импорта данных с простого источника в SQLite базу данных. Модуль по сути занимается тем, что расбирает CSV и переливает его в базу. Количество записей в тестовом источнике порядка 700К и каждую из этих записей нужно сохранить в чистую базу данных. Количество таблиц — 13. Каждая из таблиц может иметь от 3 до 12 столбцов. Количество же строк для каждой таблицы может варьироваться от нуля к нескольким ста тысячам (в особенности для таблиц пошире).

Есть прототипы под JRE и под Android. Поковырявшись с JRE и JDBC, довольно просто добился весьма приемлемых результатов в несколько секунд с помощью пакетной обработки (addBatch + executeBatch). В Android альтернативная реализация занимает очень много времени (где-то 60 с) и пока, надеюсь не окончательный, использует следующий подход:

* исполнении всех INSERT-операторов в рамках одной транзакции (я так понял, это вообще стандартная идиома в Android: beginTransaction(), n x executeInsert(), setForeignKeyConstraintsEnabled(false), setTransactionSuccessful(), endTransaction());
* "пакетировании" записей в динамически формируемом INSERT-операторе (например, 83 записи в одном INSERT для самой широкой таблицы, потому что SQLite ограничивает количество переменных 999-ью (999 div 12 = 83));
* кеширование скомпилированных динамических операторов в локальном кеше (compileStatement(...) + Guava loading cache с ключом (table; bulk row count)).

Интересует следующее:

1) Что нужно изменить, чтобы хоть как-то сократить время импорта?
2) Может, есть способ заливать данные в базу напрямую в обход API? Что-то типа как LOAD DATA INFILE в MySQL. .import в консоли является, я так понимаю, просто обёрткой над множетсвенными INSERT-ами.
3) Оказаться от штатных средств Android или вообще попробовать другую (Р)СУБД?

Спасибо.
android insert bulk sqlite3