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

Откуда:
Сообщений: 698
Когда-то читал в документации SQLite о явной возможности создания файловой БД в памяти (не :memory:). Т.е. на диске создается файл, но вся БД остается в кеше, и на диск сбрасываются данные только если превышен доп размер кеша. Примерно это в доках и написано.
Сейчас как раз понадобилась такая небольшая БД, не организовывать же под нее RAM-Disk.
Сейчас не могу найти, вроде уже все просмотрел на SQLite

"Есть многое на свете, друг Горацио, что и не сразу в голову придет."
М. Твен "Приключения Геккельбери Финна"
6 июн 19, 22:59    [21904080]     Ответить | Цитировать Сообщить модератору
 Re: Файловая БД SQLite в памяти.  [new]
Dima T
Member

Откуда:
Сообщений: 13929
Плохо смотрел. Для изменения размера кэша PRAGMA cache_size
7 июн 19, 08:39    [21904178]     Ответить | Цитировать Сообщить модератору
 Re: Файловая БД SQLite в памяти.  [new]
YUBA
Member

Откуда:
Сообщений: 698
Dima T,
Думаю, одного этого недостаточно. Видимо еще, плюс к этому, надо работать в режиме общего кэша.
Но, пока не пойму, достаточно ли этого, или еще что-то нужно.
7 июн 19, 14:34    [21904564]     Ответить | Цитировать Сообщить модератору
 Re: Файловая БД SQLite в памяти.  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 9298
Не надо думать. Надо взять и проверить предложенные вам (и вами) варианты на ваших данных.
7 июн 19, 15:03    [21904600]     Ответить | Цитировать Сообщить модератору
 Re: Файловая БД SQLite в памяти.  [new]
YUBA
Member

Откуда:
Сообщений: 698
Basil A. Sidorov
Не надо думать. Надо взять и проверить предложенные вам (и вами) варианты на ваших данных.
Да, да. Че тут думать, трясти надо.
7 июн 19, 15:19    [21904628]     Ответить | Цитировать Сообщить модератору
 Re: Файловая БД SQLite в памяти.  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7830
Сначала вопрос задайте нормально

...о явной возможности создания .... БД в памяти (не :memory:)

Т.е. на диске создается файл

Эти утверждения полностью противоречивы. Нафига файл, если БД в памяти?

Т.е. на диске создается файл, но вся БД остается в кеше, и на диск сбрасываются данные только если превышен доп размер кеша.

Вообще-то, КЭШЬ ровно так и работает по определению. Хранит данные в памяти и данные из кеша вытесняются "если превышен ... размер кеша"

Т.ч., что же Вам нужно, лично для меня загадка.

p.s.
разные умные слова write back, write throught я знаю. Но сути дела, что Т.С. сам не знает, что же ему нужно, эти умные слова не меняет.
7 июн 19, 16:11    [21904682]     Ответить | Цитировать Сообщить модератору
 Re: Файловая БД SQLite в памяти.  [new]
YUBA
Member

Откуда:
Сообщений: 698
Leonid Kudryavtsev
Т.ч., что же Вам нужно, лично для меня загадка.

Коли уж загадка. Может, тогда и писать в теме не стоило? ))

В старой документации SQLite была четко прописана конфигурация подобных БД в памяти. Новая версия - видимо документация слегка поменялась, и этот раздел исчез.
Недостатком БД :memory: является невозможность подключения к ней из разных потоков и невозможность непосредственного сохранения БД на диске.
Полагаю, что PRAGMA cache_size и режиме общего кэша решат эту задачу.
7 июн 19, 17:06    [21904747]     Ответить | Цитировать Сообщить модератору
 Re: Файловая БД SQLite в памяти.  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7830
YUBA

Чем, все что Вы описали, отличается от ОБЫЧНОЙ БД в файле?
7 июн 19, 18:43    [21904867]     Ответить | Цитировать Сообщить модератору
 Re: Файловая БД SQLite в памяти.  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7830
YUBA
Недостатком БД :memory: .... и невозможность .... сохранения БД на диске.


AFAIK можно
7 июн 19, 18:46    [21904874]     Ответить | Цитировать Сообщить модератору
 Re: Файловая БД SQLite в памяти.  [new]
YUBA
Member

Откуда:
Сообщений: 698
Leonid Kudryavtsev
YUBA

Чем, все что Вы описали, отличается от ОБЫЧНОЙ БД в файле?
Только специфичностью конфигурации.
При конфигурации SQLite по умолчанию мы получим выигрыш по времени по сравнению с обычной записью/чтением в файл только 30-35% (см документацию SQLite).
7 июн 19, 19:38    [21904907]     Ответить | Цитировать Сообщить модератору
 Re: Файловая БД SQLite в памяти.  [new]
YUBA
Member

Откуда:
Сообщений: 698
Leonid Kudryavtsev
YUBA
Недостатком БД :memory: .... и невозможность .... сохранения БД на диске.


AFAIK можно
Ладно, согласен, можно. ) Но не автоматом. И проблему это никак не решает.
Вместе с тем, обычные файлы на RAM-Disk обеспечивают скорость обмена до нескольких ГБ/с и нужна примерно аналогичная скорость от SQLite, но без RAM-Disk.
7 июн 19, 23:50    [21904995]     Ответить | Цитировать Сообщить модератору
 Re: Файловая БД SQLite в памяти.  [new]
Dima T
Member

Откуда:
Сообщений: 13929
YUBA
Вместе с тем, обычные файлы на RAM-Disk обеспечивают скорость обмена до нескольких ГБ/с и нужна примерно аналогичная скорость от SQLite, но без RAM-Disk.

Начиная с Win7 кэширование средствами ОС ничуть не хуже RAM-Disk`a. Я как-то перенес базу MS SQL c HDD на SSD, думал залетает, но скорость не поменялась, совсем. MS SQL Express имеет ограничение 1Гб оперативки, база почти 10 Гб, т.е. базу кэшировала ОС.

SQLite по умолчанию дожидается записи на диск, поэтому запись медленная, но гарантированная. Если надежность не критична, то можно не дожидаться записи на диск.
pragma synhronous=OFF;
8 июн 19, 08:24    [21905052]     Ответить | Цитировать Сообщить модератору
 Re: Файловая БД SQLite в памяти.  [new]
Dima T
Member

Откуда:
Сообщений: 13929
Неплохая статья про тюнинг SQLite
8 июн 19, 09:16    [21905060]     Ответить | Цитировать Сообщить модератору
 Re: Файловая БД SQLite в памяти.  [new]
YUBA
Member

Откуда:
Сообщений: 698
Dima T
Неплохая статья про тюнинг SQLite
У автора в экземпле для конфигурации SQLite по умолчанию получилась скорость ~0.4 МБ/с. Изначально было понятно, что скорость такой конфигурации низкая, но появилась точка отсчета.
8 июн 19, 14:31    [21905137]     Ответить | Цитировать Сообщить модератору
 Re: Файловая БД SQLite в памяти.  [new]
YUBA
Member

Откуда:
Сообщений: 698
В таблицу со структурой "CREATE TABLE IF NOT EXISTS foo(a0 real, a1 real, a2 real, a3 real, a4 real)"; записал 1000 строк массива double rt[10000][5];.
Время выполнения от начала до конца транзакции - 132.000000 ms. Конфигурация БД - по умолчанию. Версия SQLite.dll - 3.28.
Подсчет времени производился программой:
time_t t0;
time_t t1;
t0 = clock();
// выполняется запрос
t1 = clock();
float duration = (float)(t1 - t0);
printf("Job time %f\n", duration);
В разделе С++ пишут, что она не оч. корректно измеряет время.
Фрагмент программы записи в массива в таблицу см в теме Как вставить много строк из двумерного массива.
9 июн 19, 21:45    [21905539]     Ответить | Цитировать Сообщить модератору
 Re: Файловая БД SQLite в памяти.  [new]
White Owl
Member

Откуда:
Сообщений: 12390
YUBA
В разделе С++ пишут, что она не оч. корректно измеряет время.
Ты не правильно читаешь. У компьютера несколько разных "времен". И все они корректны, но результаты надо правильно понимать.

Если тебя интересует сколько человек будет ждать отклика от программы используй time(), но оно даст приблизительное значение зависящее от загруженности компьютера другими задачами. Если у тебя в один запуск не было ничего другого, а в другой запуск куча приложений сожрали всю память - измерение через time() тебе это предсказать не сможет.
Если ты хочешь узнать сколько времени процессор провел над твоей программой - тогда используешь clock(). Оно тебе даст довольно точное время вне зависимости от загруженности машины, но будет всегда "занижать" с точки зрения человека. Именно потому что все фоновые задачи просто не учитываются.

Есть еще несколько вариантов измерения времени, но все они в основном разнятся точностью, но по сути сводятся к этим двум временам - реальному или процессорному.
10 июн 19, 01:32    [21905596]     Ответить | Цитировать Сообщить модератору
 Re: Файловая БД SQLite в памяти.  [new]
YUBA
Member

Откуда:
Сообщений: 698
Сделал аналогичную БД в :memory:, задача выполняется за 3 мс. Конфигурация аналогична.
Размера кэша PRAGMA cache_size на быстродействие при записи небольших объемов данных никак не влияет. У нас размер 1000 строк массива вида double rt[N][5] - примерно 40 кБ.
10 июн 19, 19:33    [21906170]     Ответить | Цитировать Сообщить модератору
 Re: Файловая БД SQLite в памяти.  [new]
YUBA
Member

Откуда:
Сообщений: 698
Хороший прирост быстродействия дает PRAGMA journal_mode=MEMORY; Время выполнения колеблется в среднем от 40 до 70 мс. В основном в интервале 50-60 мс. По скорости передачи это ~ 1 МБ/с.
Напомню, ранее время выполнения запроса было ~130 мс.
Фрагмент программы записи данных в БД см в теме - Как вставить много строк из двумерного массива]
10 июн 19, 23:52    [21906265]     Ответить | Цитировать Сообщить модератору
 Re: Файловая БД SQLite в памяти.  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7830
Неплохая статья/тест по производительности insert в SQL Lite правда 10 летней давности (найдено через google).
Данные в этой статьи как-то более релевантны моему восприятию мира, чем цифры в данном топике.
+

https://stackoverflow.com/questions/1711631/improve-insert-per-second-performance-of-sqlite

The "Worst-Case-Scenario" (auto commit) - 85 inserts per second.
Using a Transaction - 23,000 inserts per second.
Using a Prepared Statement - 53,000 inserts per second.
PRAGMA synchronous = OFF - 69,600 inserts per second.
PRAGMA journal_mode = MEMORY - 64,000 inserts per second.
PRAGMA synchronous = OFF and PRAGMA journal_mode = MEMORY - 72,000 inserts per second.
Using an In-Memory Database = 79,000 inserts per second.
11 июн 19, 15:41    [21906812]     Ответить | Цитировать Сообщить модератору
 Re: Файловая БД SQLite в памяти.  [new]
NewBy52
Member

Откуда: Воронеж
Сообщений: 24
Leonid Kudryavtsev
The "Worst-Case-Scenario" (auto commit) - 85 inserts per second.
Using a Transaction - 23,000 inserts per second.
Using a Prepared Statement - 53,000 inserts per second.
PRAGMA synchronous = OFF - 69,600 inserts per second.
PRAGMA journal_mode = MEMORY - 64,000 inserts per second.
PRAGMA synchronous = OFF and PRAGMA journal_mode = MEMORY - 72,000 inserts per second.
Using an In-Memory Database = 79,000 inserts per second.

Да, это похоже.
11 июн 19, 17:00    [21906914]     Ответить | Цитировать Сообщить модератору
 Re: Файловая БД SQLite в памяти.  [new]
YUBA
Member

Откуда:
Сообщений: 698
Leonid Kudryavtsev
https://stackoverflow.com/questions/1711631/improve-insert-per-second-performance-of-sqlite

The "Worst-Case-Scenario" (auto commit) - 85 inserts per second.
Using a Transaction - 23,000 inserts per second.
Using a Prepared Statement - 53,000 inserts per second.
PRAGMA synchronous = OFF - 69,600 inserts per second.
PRAGMA journal_mode = MEMORY - 64,000 inserts per second.
PRAGMA synchronous = OFF and PRAGMA journal_mode = MEMORY - 72,000 inserts per second.
Using an In-Memory Database = 79,000 inserts per second.
[/spoiler]
Пока дело касается дисковых БД, соотношения скоростей примерно аналогичны. Даже то, что совместное применение PRAGMA synchronous = OFF and PRAGMA journal_mode = MEMORY не дает сколь-либо существенного прироста скорости (в моем случае где-то в пределах стат погрешности), а по отдельности эффекты применения сопоставимы.
Что касается БД :memory:, тут да, значительное расхождение.
Однако, тест 10-ти летней давности, версии SQLite уже совсем другие.
11 июн 19, 17:15    [21906931]     Ответить | Цитировать Сообщить модератору
 Re: Файловая БД SQLite в памяти.  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7830
YUBA
...
Недостатком БД :memory: является невозможность подключения к ней из разных потоков и невозможность непосредственного сохранения БД на диске.

Сам не делал, но вроде
1. можно
"This allows separate database connections to share the same in-memory database. Of course, all database connections sharing the in-memory database need to be in the same process."
https://www.sqlite.org/inmemorydb.html
2. можно
https://www.sqlite.org/backup.html
11 июн 19, 17:19    [21906934]     Ответить | Цитировать Сообщить модератору
 Re: Файловая БД SQLite в памяти.  [new]
YUBA
Member

Откуда:
Сообщений: 698
Leonid Kudryavtsev
YUBA
...
Недостатком БД :memory: является невозможность подключения к ней из разных потоков и невозможность непосредственного сохранения БД на диске.

Сам не делал, но вроде
1. можно
"This allows separate database connections to share the same in-memory database. Of course, all database connections sharing the in-memory database need to be in the same process."
https://www.sqlite.org/inmemorydb.html
2. можно
https://www.sqlite.org/backup.html
Я уже с вами ранее согласился. Можно. И сохранять - есть методы, но не автосохранение, как в случае с дисковой БД. Это не катит.
Не проблема и совместный доступ, но исключительно из одного потока. В моем случае должны взаимодействовать разные, даже не потоки, а приложения.
11 июн 19, 17:33    [21906941]     Ответить | Цитировать Сообщить модератору
 Re: Файловая БД SQLite в памяти.  [new]
Leonid Kudryavtsev
Member

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

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

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

Теоретически. Конкретный код (и версии), разумеется, может работать как-то неправильно и содержать баги. Вполне возможно, еще какие-то блокировки или миханизмы срабатывают. Нужно запускать конкретный код и как-то смотреть. что происходит.
====
P.S.
Сам использовал SQLite для сохранения десятков миллионов строк данных. Ничего даже не настраивал. Т.к. лично мне производительности вполне хватало
11 июн 19, 17:35    [21906944]     Ответить | Цитировать Сообщить модератору
 Re: Файловая БД SQLite в памяти.  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7830
YUBA
....
должны взаимодействовать разные, даже не потоки, а приложения.

IMHO & AFAIK
Тогда SQLite странный выбор. Лучше взять полноценные БД (PostgreSQL, MySQL, Oracle etc)
11 июн 19, 17:48    [21906956]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / SQLite Ответить