Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Очень медленно работает insert в sqlite  (Прочитано 2501 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн danilsl

  • Автор темы
  • Участник
  • *
  • Сообщений: 170
    • Просмотр профиля
Очень медленно работает insert в sqlite
« : 28 Сентября 2014, 00:46:15 »
Всем привет.
Пишу прогу с использованием sqlite. Прога держит в базе порядка 2-5 миллионов записей. Высасывание даже всех сразу записей отрабатывает за секунду-две. А вот вставка идёт нереально долго. Даже 3 тысячи записей вставляются минут пять. При этом загрузка проца по нулям, индикатор обращения к диску просто горит, а не моргает. В итоге всего этого получается файлик в 50 килобайт. За пять минут!!! Создание базы в миллионы записей я не дождался, перенёс её в tmpfs, после этого база начала создаваться за минуты.
В целом проблема понятна, медленный диск, отсутствие файлового кеша для операций изменения бд и бла бла бла. Только стоит SSD и скорость записи упирается в предел сата2. А вот у конечных потребителей вероятнее всего будет тот самый бла бла бла, да ещё и под виндой.
Я очень мало работал с базами данных, с sqlite вообще мой первый опыт. Подскажите пожалуйста, можно ли как-то ускорить операции insert, или создавать базу в оперативке, а после завершения инсертов кидать на диск. Я пишу на c++ с Qt. Идеальным вариантом было бы скормить в QSqlDatabase что-нибудь вроде QBuffer, я такого способа не нашел. Ну а tmpfs не годится по причине, что прога должна будет ещё и в винде работать.

Пользователь решил продолжить мысль 28 Сентября 2014, 02:04:02:
Небольшой эффект дало использование QSqlDatabase::transaction() и QSqlDatabase::commit(). Небольшое количество данных, порядка 10000 записей, втыкается меньше чем за секунду на ssd, а девять с половиной миллионов записей на tmpfs работало 15 минут. И я начал подозревать, что скорость вставки напрямую зависит от размера базы. Я пробовал использовать и PK INTEGER AUTOINCREMENT, и INTEGER, который ручками делал инкрементом, разницы не увидел, но имхо основные тормоза на уникальных полях. Можно ли отключить их контроль, чтоб я сам их формировал и контролил? Ещё что-то про индексы пишут, но что-то я не догоняю, по-моему они селекту помогают, а вставка только долше от них будет.
« Последнее редактирование: 28 Сентября 2014, 02:04:02 от danilsl »

Оффлайн unimix

  • Активист
  • *
  • Сообщений: 537
    • Просмотр профиля
Re: Очень медленно работает insert в sqlite
« Ответ #1 : 28 Сентября 2014, 22:35:26 »
Возможно, что скорость недостаточная из-за лишних обработок блокировок к базе. Можно попробовать установить эксклюзивную блокировку во время одновременного сохранения большого количества записей.

Вот тут можно почитать по теме блокировок:

 

Страница сгенерирована за 0.018 секунд. Запросов: 21.