Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / SQLite Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
 Re: Файловая БД SQLite в памяти.  [new]
YUBA
Member

Откуда:
Сообщений: 698
Leonid Kudryavtsev
YUBA
PRAGMA synchronous = OFF...не дает сколь-либо существенного прироста скорости (в моем случае где-то в пределах стат погрешности)...

Теоретически, при synchronous = OFF неоткуда взяться:
YUBA
В смысле быстродействия, как писалось ранее это ничего не дает, и не могло дать, т.к. основное время выполнения запроса занимают дисковые операции.

Т.к. лично я бы ожидал, что при synchronous = OFF дисковые операции должны завершаться мгновенно. Данные передаются в OS и управление тут же возврашается обратно. Собственно ввода-вывода никто ждать не должен.

Теоретически. Конкретный код (и версии), разумеется, может работать как-то неправильно и содержать баги. Вполне возможно, еще какие-то блокировки или миханизмы срабатывают. Нужно запускать конкретный код и как-то смотреть. что происходит.
====
P.S.
Сам использовал SQLite для сохранения десятков миллионов строк данных. Ничего даже не настраивал. Т.к. лично мне производительности вполне хватало
Было написано другое - Даже то, что совместное применение PRAGMA synchronous = OFF and PRAGMA journal_mode = MEMORY не дает сколь-либо существенного прироста скорости (в моем случае где-то в пределах стат погрешности), . И далее - а по отдельности эффекты применения сопоставимы.. В общем, примерно как в вашей ссылке на тест.
И еще, при передаче 1000 строк (как я), или 5000 строк - время выполнения меняется не пропорционально. Точно не помню, увеличивается примерно в 2 раза, а не в 5 раз. Т.е., производительность растет.
Однако, мне нужно много коротких транзакций, и я тестирую для своих задач.
11 июн 19, 17:50    [21906959]     Ответить | Цитировать Сообщить модератору
 Re: Файловая БД SQLite в памяти.  [new]
YUBA
Member

Откуда:
Сообщений: 698
Leonid Kudryavtsev
IMHO & AFAIK
Тогда SQLite странный выбор. Лучше взять полноценные БД (PostgreSQL, MySQL, Oracle etc)
Нет, это не рацо. БД небольшая по объему, но должна быть быстрой. Повторюсь, передача данных CSV-файлами через RAM-Disk меня вполне бы устроило. Лишний здесь только RAM-Disk. ) И все это по любому должно писаться в БД.
SQLite декларируется именно как замена файловых операций. И убиваются сразу 2 зайца.)
11 июн 19, 17:57    [21906966]     Ответить | Цитировать Сообщить модератору
 Re: Файловая БД SQLite в памяти.  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7834
YUBA
...через RAM-Disk меня вполне бы устроило....

Теоретически. можно попытаться создать
https://docs.microsoft.com/en-us/windows/desktop/memory/creating-named-shared-memory
и затолкать файл БД SQLite туда. Если ни журналы, ни транзакции Вам на самом деле не нужны, может даже и заработает.

Но я так не делал. И, возможно, нужно смотреть(или даже править) код VFS
(https://www.sqlite.org/vfs.html)
11 июн 19, 18:16    [21906976]     Ответить | Цитировать Сообщить модератору
 Re: Файловая БД SQLite в памяти.  [new]
YUBA
Member

Откуда:
Сообщений: 698
Leonid Kudryavtsev
Теоретически. можно попытаться создать
https://docs.microsoft.com/en-us/windows/desktop/memory/creating-named-shared-memory
и затолкать файл БД SQLite туда. Если ни журналы, ни транзакции Вам на самом деле не нужны, может даже и заработает.

Не люблю я named pipes.) Сейчас используются Сокеты (вопросы те-же, что и с named pipes).
Вначале нужно придумать протоколы обмена, потом перекодировать в CSV-string, передать, раскодировать, записать в БД в ее формате в несколько таблиц. Кроме того, Сокеты ненадежны в смысле автовосстановления связи после обрыва - надо перезапускать и сервер и клиент. Иначе то восстанавливается, то нет - по наитию.)
С named pipes немного по другому, но тоже радости мало. Сокеты, имхо, поинтересней будут.
11 июн 19, 18:47    [21906997]     Ответить | Цитировать Сообщить модератору
 Re: Файловая БД SQLite в памяти.  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7834
YUBA
Что касается БД :memory:, тут да, значительное расхождение.


Возможно Вы в замеры времени кроме insert + commit померили еще и открытие/закрытие БД ?
Тогда расхождение хоть как-то объяснимо.
11 июн 19, 22:12    [21907077]     Ответить | Цитировать Сообщить модератору
 Re: Файловая БД SQLite в памяти.  [new]
YUBA
Member

Откуда:
Сообщений: 698
Leonid Kudryavtsev, нет, перед begin цикла.
Ради интнреса попробовал писать в БД текстовые строки вида -
insert into foo(a0,a1,a2,a3,a4) values (5.8920000000000000E+03, ..... ,2.4204000000000000E+04 );
через, через snprintf() при аналогичной конфигурации.
Dima T
Лучше параметризованный запрос как выше посоветовали. Еще можно сформировать свой инсерт, читай про snprintf()
Время исполнения зашкаливает - в 4-5 раз больше худшего, до 390 мс.
11 июн 19, 23:27    [21907100]     Ответить | Цитировать Сообщить модератору
 Re: Файловая БД SQLite в памяти.  [new]
YUBA
Member

Откуда:
Сообщений: 698
Вроде задача решена. Этим:
er = sqlite3_exec(db, "PRAGMA journal_mode = MEMORY; PRAGMA temp_store = 2; pragma synchronous = 0", 0, 0, &err);

Удалось добиться быстродействия (4-10) мс/запрос, что соответствует в среднем ~8МБ/с. В режиме :memory: было 2 мс/запрос.
Этого должно вполне хватить для конкретных задач.
Всем спасибо.
12 июн 19, 01:39    [21907124]     Ответить | Цитировать Сообщить модератору
 Re: Файловая БД SQLite в памяти.  [new]
YUBA
Member

Откуда:
Сообщений: 698
Так как тема Sqlite в многопоточной программе была закрыта модератором (и поделом ей)), то сообщаю результаты здесь. Тем более, что тема являлась продолжением этой.
Суть темы была в том, что Sqlite работала в основном потоке, а потоки событий не видели указатель на базу данных.
Было сделано предположение, что объект класса cDB (непосредственно работает с БД) выходил из области видимости основного потока, и потоки событий cDB не видели.
Не знаю, насколько такое предположение правильно, но основной поток был модифицирован таким образом, чтобы класс cDB оставался в области видимости основного потока. После такой модификации все потоки стабильно работают с Sqlite.
Задача решена.
27 июл 19, 15:16    [21935990]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
Все форумы / SQLite Ответить