Я делаю некоторое сравнение производительности, идти ли на сериализацию данных или хранить их в БД. Приложение получает чертовски много данных (x ГБ), которые необходимо сохранить с минимальной скоростью 18 МБ / с (как сейчас)
Хранение в БД предлагает более простую функциональность с точки зрения поиска и доступа к данным в более позднее время, моментальных снимков данных, миграции данных и т. Д., Но мои тесты пока показывают огромную разницу во времени производительности.
Тест сохраняет 1000 объектов (около 7 сотен килобайт каждый). Либо в соответствующие столбцы в таблице, либо на диск, сохранив их как общий список. (SQLite заканчивается немного больше данных)
- Сохранение в SQLite v3, общий размер 745 МБ: 30,7 секунды (~ скорость: 24,3 МБ / с)
- Сериализация на диск, общий размер 741 МБ: 0,33 секунды (~ скорость: 2245 МБ / с)
Я не делал никаких настроек производительности для SQLite, просто использовал его из коробки с Fluent nHibernate и адаптером SQLite.Data (без транзакций), но сначала подумал, что это огромная разница.
Очевидно, я знаю, что прохождение через ORM mapper и DB для записи на диск дает дополнительные издержки по сравнению с сериализацией, но это было много.
Кроме того, соображения должны сохранять данные сразу же, как я их получаю. В случае сбоя питания мне нужны последние полученные данные.
Есть мысли?
----- Обновления (поскольку я продолжаю исследовать решения) ------
- Оборачивая 1000 вставок в транзакции, время теперь составляло ~ 14 с = 53 МБ / с, однако, если я выбрасываю исключение на полпути, я теряю все свои данные.
- Использование IStatelessSession сокращает время на 0,5-1 с
- Не наблюдалось какого-либо прироста производительности при назначении идентификатора сущности вместо его автоматического назначения в таблице и, следовательно, избавления от (выберите row_generatedid ()) для каждой вставки sql. -> Id (x => x.Id) .GeneratedBy.Assigned ();
- альтернатива nosync () в SQLite не является альтернативой, поскольку БД может быть повреждена в случае сбоя питания.