Ситуация: клиентское приложение .Net (C #, Mono) загружает данные из веб-службы (SOAP) и сохраняет их в Sqlite DB. Интерфейс БД - System.Data.Sqlite, который под капотом использует sqlite3.dll.
БД (130 МБ) имеет несколько десятков таблиц. Одна таблица особенно велика и занимает 90% размера БД - 10000 записей с некоторыми столбцами BLOB-объектов. (Самый большой шарик имеет 260K.)
Загрузка на iPad занимает 22 минуты. Когда я закомментировал фактическую запись в БД, это заняло около 11 минут, так что, похоже, БД тоже занимает около 11 минут. Под «БД» я подразумеваю некоторый слой над System.Data.Sqlite. Пока не знаю деталей. Все, что я знаю, это то, что все команды БД находятся в транзакции, и в ней участвует всего несколько транзакций. (Другими словами, транзакции не являются проблемой.)
Когда я выгрузил БД с помощью оболочки Sqlite и измерил код C, который вызывает sqlite3_exec (), с помощью выведенной строки (этот код далеко не оптимален), я получил около 50 секунд (iPad). Это означает, что код sqlite C может очень быстро создать БД.
Еще одна интересная проблема:
Загрузка организована таблица за таблицей. Все таблицы (некоторые из них имеют несколько МБ) работают нормально. За исключением самой большой таблицы, где загрузка должна была быть реорганизована в несколько элементов (5) одновременно. Без этой меры загрузка не удалась из-за недостатка памяти. Наиболее вероятное объяснение - фрагментация памяти. (Mono имеет проблемы с GC и не дает хорошей информации о памяти.)
Мне кажется, что сам процесс загрузки отвечает за меньшую часть проблемы. Он загружает примерно тот же размер, что и БД. Фрагментация не должна быть проблемой. Но однопоточная организация добавляет задержку.
Однако я чувствую, что самая большая проблема - обработка данных в приложении.
- Он должен анализировать несколько протоколов (http, SOAP, Xml)
- Обработка данных в System.Data.Sqlite и вызов sqlite3.dll. Это, вероятно, включает в себя распределение, сортировку и т. Д.
Мы проведем больше тестов позже, но сейчас я хотел бы попросить вас об идеях. Например, я бы приветствовал сравнение производительности System.Data.Sqlite и raw Sqlite. Кто-нибудь?