Помощник
Здравствуйте, гость ( Вход | Регистрация )
|
|
3:04:2008, 09:17
|
|
Новенький ![]() Группа: Программист Сообщений: 2 Регистрация: 3:04:2008 Пользователь №: 16 351 Репутация: 0
|
Здравствуйте!
Собственно, мне нужно осуществлять динамическую запись в журнал происходящих в программе изменений. Делаю это с помощью базы данных SQLite. Пишу на С++, используя исходные тексты на С - sqlite-source-3_3_15. Хотелось бы оптимизировать скорость выполнения записи в таблицу. Для записи использую только функцию sqlite3_exec(..,"INSERT INTO ...",..); Базу открываю и закрываю только один раз в процессе работы программы. Так как вставка записей в таблицу (INSERT) происходит очень часто (несколько сотен в секунду), то программа сильно тормозит. Судя по всему, медленная работа винчестера, так как загрузка процессора при этом небольшая. Вроде движок SQLite называют самым быстрым. Или для этой цели вообще любая база данных не подойдет и надо использовать другие механизмы, вроде записи в текстовые или бинарные файлы? Может кто-нибудь подсказать? |
|
Сообщение
#1
|
|
![]() |
|
|
3:04:2008, 09:37
|
|
============== ![]() ![]() ![]() ![]() ![]() Группа: Модеры Сообщений: 1 740 Регистрация: 11:01:2007 Пользователь №: 8 750 Специализация: specialist Репутация: 27
|
Покажите какого вида команды идут. То что INSERT понятно, а в полном виде их посмотреть?
Но есть подозрение что дело в программе ... |
|
Сообщение
#2
|
|
|
|
3:04:2008, 09:42
|
|
Божественный ![]() ![]() ![]() ![]() ![]() Группа: Модеры Сообщений: 1 816 Регистрация: 4:09:2006 Из: Минск Пользователь №: 6 316 Специализация: C++ Репутация: 31
|
Если я правильно понимаю, то sqlite3_exec начинает транзакцию, вставляет запись, завершает транзакцию. На выполнение транзакций требуется относительно много времени. Т.е. Ваш способ очень не производителен.
Первым шагом улучшения производительности является использование многострочных вставок (Multirow inserts) (синтаксис ЗДЕСЬ). Размер вставок для Вашего случая можно попробовать в районе 10-20. Далее, возможно Ваша таблица индексирована или имеет триггеры вставки, что тоже будет давать замедление. Следующим шагом стоит отметить оптимизацию добавляемых данных, т.к., возможно, их можно представить более компактно. На сколько мне известно, коньком движков подобных SQLLite является быстрая выборка данных, но никак не их вставка. Возможно, быстрее писать в файл... В общем, Вы дали слишком мало информации чтобы посоветовать что-то конкретное |
|
Сообщение
#3
|
|
|
|
4:04:2008, 09:46
|
|
Новенький ![]() Группа: Программист Сообщений: 2 Регистрация: 3:04:2008 Пользователь №: 16 351 Репутация: 0
|
Если я правильно понимаю, то sqlite3_exec начинает транзакцию, вставляет запись, завершает транзакцию. На выполнение транзакций требуется относительно много времени. Т.е. Ваш способ очень не производителен. Большое спасибо! Теперь записи накапливаю в отдельном списке, а потом все сразу записываю в таблицу в одной транзакции: CODE BEGIN; INSERT INTO Log VALUES (...); INSERT INTO Log VALUES (...); INSERT INTO Log VALUES (...); ... COMMIT; (мультистроковый ввод моя версия SQLite не поддерживает). Плюс вынесла процедуру записи в отдельный поток (Windows). Теперь со скоростью проблем нет Спасибо всем! |
|
Сообщение
#4
|
|
![]() |
|
Текстовая версия | Сейчас: 17:05:2008 - 03:49 |