Ускорить вставку в Android SQLite
От: halo Украина  
Дата: 23.02.19 14:57
Оценка:
Здравствуйте.

Пишу на 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 или вообще попробовать другую (Р)СУБД?

Спасибо.
Отредактировано 23.02.2019 15:00 halo (LastPass снова испортил поля формы) . Предыдущая версия . Еще …
Отредактировано 23.02.2019 14:59 halo ((ошибочное предположение об ошибке)) . Предыдущая версия .
android insert bulk sqlite3
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.