Производительность System.Data.Sqlite (C #) и Sqlite (C) - PullRequest
0 голосов
/ 20 января 2012

Ситуация: клиентское приложение .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. Кто-нибудь?

1 Ответ

1 голос
/ 22 января 2012

За последние несколько дней я провел несколько тестов с Mono.Data.Sqlite и обнаружил, что производительность вставки ужасна.

Я вижу только ~ 14 000 вставок в секунду с C # по сравнению с ~ 38 000 с эквивалентом C. Это происходит с помощью вставки строки, строки, строки, строки, строки, строки, DateTime в транзакцию с использованием параметризованного оператора, вставляющего 1 024 000 строк. (та же производительность, значительно уменьшив количество строк)

Закомментируя фактический ExecuteNonQuery, и C и C # проходят для меня одинаковое количество итераций - около 112 000 в секунду (генерация строк), поэтому в моем случае возникает проблема, однако mono обрабатывает взаимодействие с sqlite.

Эти тесты проходили под MacOSX, и я не пробовал на реальном устройстве из-за отсутствия платной лицензии на одно касание, чтобы посмотреть, улучшится ли это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...