• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Скорость выполнения записи в Sqlite

  • Автор темы OMu4KA
  • Дата начала
O

OMu4KA

Здравствуйте!
Собственно, мне нужно осуществлять динамическую запись в журнал происходящих в программе изменений. Делаю это с помощью базы данных SQLite. Пишу на С++, используя исходные тексты на С - sqlite-source-3_3_15.
Хотелось бы оптимизировать скорость выполнения записи в таблицу.
Для записи использую только функцию sqlite3_exec(..,"INSERT INTO ...",..);
Базу открываю и закрываю только один раз в процессе работы программы.
Так как вставка записей в таблицу (INSERT) происходит очень часто (несколько сотен в секунду), то программа сильно тормозит. Судя по всему, медленная работа винчестера, так как загрузка процессора при этом небольшая.
Вроде движок SQLite называют самым быстрым.
Или для этой цели вообще любая база данных не подойдет и надо использовать другие механизмы, вроде записи в текстовые или бинарные файлы?
Может кто-нибудь подсказать?
 
E

European

Если я правильно понимаю, то sqlite3_exec начинает транзакцию, вставляет запись, завершает транзакцию. На выполнение транзакций требуется относительно много времени. Т.е. Ваш способ очень не производителен.
Первым шагом улучшения производительности является использование многострочных вставок (Multirow inserts) (синтаксис ). Размер вставок для Вашего случая можно попробовать в районе 10-20. Далее, возможно Ваша таблица индексирована или имеет триггеры вставки, что тоже будет давать замедление.
Следующим шагом стоит отметить оптимизацию добавляемых данных, т.к., возможно, их можно представить более компактно.
На сколько мне известно, коньком движков подобных SQLLite является быстрая выборка данных, но никак не их вставка. Возможно, быстрее писать в файл...
В общем, Вы дали слишком мало информации чтобы посоветовать что-то конкретное
 
O

OMu4KA

Если я правильно понимаю, то sqlite3_exec начинает транзакцию, вставляет запись, завершает транзакцию. На выполнение транзакций требуется относительно много времени. Т.е. Ваш способ очень не производителен.

Большое спасибо!
Теперь записи накапливаю в отдельном списке, а потом все сразу записываю в таблицу в одной транзакции:
[codebox]BEGIN;
INSERT INTO Log VALUES (...);
INSERT INTO Log VALUES (...);
INSERT INTO Log VALUES (...);
...
COMMIT;[/codebox]
(мультистроковый ввод моя версия SQLite не поддерживает).

Плюс вынесла процедуру записи в отдельный поток (Windows).
Теперь со скоростью проблем нет :) .

Спасибо всем!
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!