Гость
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Файловая БД SQLite в памяти. / 25 сообщений из 33, страница 1 из 2
06.06.2019, 22:59
    #39823779
YUBA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Файловая БД SQLite в памяти.
Когда-то читал в документации SQLite о явной возможности создания файловой БД в памяти (не :memory:). Т.е. на диске создается файл, но вся БД остается в кеше, и на диск сбрасываются данные только если превышен доп размер кеша. Примерно это в доках и написано.
Сейчас как раз понадобилась такая небольшая БД, не организовывать же под нее RAM-Disk.
Сейчас не могу найти, вроде уже все просмотрел на SQLite

"Есть многое на свете, друг Горацио, что и не сразу в голову придет."
М. Твен "Приключения Геккельбери Финна"
...
Рейтинг: 0 / 0
07.06.2019, 08:39
    #39823843
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Файловая БД SQLite в памяти.
Плохо смотрел. Для изменения размера кэша PRAGMA cache_size
...
Рейтинг: 0 / 0
07.06.2019, 14:34
    #39824065
YUBA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Файловая БД SQLite в памяти.
Dima T,
Думаю, одного этого недостаточно. Видимо еще, плюс к этому, надо работать в режиме общего кэша .
Но, пока не пойму, достаточно ли этого, или еще что-то нужно.
...
Рейтинг: 0 / 0
07.06.2019, 15:03
    #39824091
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Файловая БД SQLite в памяти.
Не надо думать. Надо взять и проверить предложенные вам (и вами) варианты на ваших данных.
...
Рейтинг: 0 / 0
07.06.2019, 15:19
    #39824115
YUBA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Файловая БД SQLite в памяти.
Basil A. SidorovНе надо думать. Надо взять и проверить предложенные вам (и вами) варианты на ваших данных. Да, да. Че тут думать, трясти надо.
...
Рейтинг: 0 / 0
07.06.2019, 16:11
    #39824145
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Файловая БД SQLite в памяти.
Сначала вопрос задайте нормально

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

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

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

p.s.
разные умные слова write back, write throught я знаю. Но сути дела, что Т.С. сам не знает, что же ему нужно, эти умные слова не меняет.
...
Рейтинг: 0 / 0
07.06.2019, 17:06
    #39824186
YUBA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Файловая БД SQLite в памяти.
Leonid KudryavtsevТ.ч., что же Вам нужно, лично для меня загадка.
Коли уж загадка. Может, тогда и писать в теме не стоило? ))

В старой документации SQLite была четко прописана конфигурация подобных БД в памяти. Новая версия - видимо документация слегка поменялась, и этот раздел исчез.
Недостатком БД :memory: является невозможность подключения к ней из разных потоков и невозможность непосредственного сохранения БД на диске.
Полагаю, что PRAGMA cache_size и режиме общего кэша решат эту задачу.
...
Рейтинг: 0 / 0
07.06.2019, 18:43
    #39824275
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Файловая БД SQLite в памяти.
YUBA
Чем, все что Вы описали, отличается от ОБЫЧНОЙ БД в файле?
...
Рейтинг: 0 / 0
07.06.2019, 18:46
    #39824279
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Файловая БД SQLite в памяти.
YUBAНедостатком БД :memory: .... и невозможность .... сохранения БД на диске.

AFAIK можно
...
Рейтинг: 0 / 0
07.06.2019, 19:38
    #39824298
YUBA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Файловая БД SQLite в памяти.
Leonid KudryavtsevYUBA
Чем, все что Вы описали, отличается от ОБЫЧНОЙ БД в файле? Только специфичностью конфигурации.
При конфигурации SQLite по умолчанию мы получим выигрыш по времени по сравнению с обычной записью/чтением в файл только 30-35% (см документацию SQLite).
...
Рейтинг: 0 / 0
07.06.2019, 23:50
    #39824349
YUBA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Файловая БД SQLite в памяти.
Leonid KudryavtsevYUBAНедостатком БД :memory: .... и невозможность .... сохранения БД на диске.

AFAIK можноЛадно, согласен, можно. ) Но не автоматом. И проблему это никак не решает.
Вместе с тем, обычные файлы на RAM-Disk обеспечивают скорость обмена до нескольких ГБ/с и нужна примерно аналогичная скорость от SQLite, но без RAM-Disk.
...
Рейтинг: 0 / 0
08.06.2019, 08:24
    #39824376
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Файловая БД SQLite в памяти.
YUBAВместе с тем, обычные файлы на RAM-Disk обеспечивают скорость обмена до нескольких ГБ/с и нужна примерно аналогичная скорость от SQLite, но без RAM-Disk.
Начиная с Win7 кэширование средствами ОС ничуть не хуже RAM-Disk`a. Я как-то перенес базу MS SQL c HDD на SSD, думал залетает, но скорость не поменялась, совсем. MS SQL Express имеет ограничение 1Гб оперативки, база почти 10 Гб, т.е. базу кэшировала ОС.

SQLite по умолчанию дожидается записи на диск, поэтому запись медленная, но гарантированная. Если надежность не критична, то можно не дожидаться записи на диск.
Код: sql
1.
pragma synhronous=OFF;
...
Рейтинг: 0 / 0
08.06.2019, 09:16
    #39824381
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Файловая БД SQLite в памяти.
...
Рейтинг: 0 / 0
08.06.2019, 14:31
    #39824424
YUBA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Файловая БД SQLite в памяти.
Dima TНеплохая статья про тюнинг SQLite У автора в экземпле для конфигурации SQLite по умолчанию получилась скорость ~0.4 МБ/с. Изначально было понятно, что скорость такой конфигурации низкая, но появилась точка отсчета.
...
Рейтинг: 0 / 0
09.06.2019, 21:45
    #39824668
YUBA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Файловая БД SQLite в памяти.
В таблицу со структурой "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.
Подсчет времени производился программой:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
time_t t0;
time_t t1;
t0 = clock();
// выполняется запрос
t1 = clock();
float duration = (float)(t1 - t0);
printf("Job time %f\n", duration);

В разделе С++ пишут, что она не оч. корректно измеряет время.
Фрагмент программы записи в массива в таблицу см в теме Как вставить много строк из двумерного массива.
...
Рейтинг: 0 / 0
10.06.2019, 01:32
    #39824716
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Файловая БД SQLite в памяти.
YUBAВ разделе С++ пишут, что она не оч. корректно измеряет время.Ты не правильно читаешь. У компьютера несколько разных "времен". И все они корректны, но результаты надо правильно понимать.

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

Есть еще несколько вариантов измерения времени, но все они в основном разнятся точностью, но по сути сводятся к этим двум временам - реальному или процессорному.
...
Рейтинг: 0 / 0
10.06.2019, 19:33
    #39825100
YUBA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Файловая БД SQLite в памяти.
Сделал аналогичную БД в :memory:, задача выполняется за 3 мс. Конфигурация аналогична.
Размера кэша PRAGMA cache_size на быстродействие при записи небольших объемов данных никак не влияет. У нас размер 1000 строк массива вида double rt[N][5] - примерно 40 кБ.
...
Рейтинг: 0 / 0
10.06.2019, 23:52
    #39825140
YUBA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Файловая БД SQLite в памяти.
Хороший прирост быстродействия дает PRAGMA journal_mode=MEMORY; Время выполнения колеблется в среднем от 40 до 70 мс. В основном в интервале 50-60 мс. По скорости передачи это ~ 1 МБ/с.
Напомню, ранее время выполнения запроса было ~130 мс.
Фрагмент программы записи данных в БД см в теме - Как вставить много строк из двумерного массива ]
...
Рейтинг: 0 / 0
11.06.2019, 15:41
    #39825449
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Файловая БД SQLite в памяти.
Неплохая статья/тест по производительности 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.
...
Рейтинг: 0 / 0
11.06.2019, 17:00
    #39825498
NewBy52
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Файловая БД SQLite в памяти.
Leonid KudryavtsevThe "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.

Да, это похоже.
...
Рейтинг: 0 / 0
11.06.2019, 17:15
    #39825510
YUBA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Файловая БД SQLite в памяти.
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 уже совсем другие.
...
Рейтинг: 0 / 0
11.06.2019, 17:19
    #39825513
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Файловая БД SQLite в памяти.
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
...
Рейтинг: 0 / 0
11.06.2019, 17:33
    #39825519
YUBA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Файловая БД SQLite в памяти.
Leonid KudryavtsevYUBA...
Недостатком БД :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 Я уже с вами ранее согласился. Можно. И сохранять - есть методы, но не автосохранение, как в случае с дисковой БД. Это не катит.
Не проблема и совместный доступ, но исключительно из одного потока. В моем случае должны взаимодействовать разные, даже не потоки, а приложения.
...
Рейтинг: 0 / 0
11.06.2019, 17:35
    #39825521
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Файловая БД SQLite в памяти.
YUBAPRAGMA synchronous = OFF...не дает сколь-либо существенного прироста скорости (в моем случае где-то в пределах стат погрешности)...
Теоретически, при synchronous = OFF неоткуда взяться:
YUBAВ смысле быстродействия, как писалось ранее это ничего не дает, и не могло дать, т.к. основное время выполнения запроса занимают дисковые операции .
Т.к. лично я бы ожидал, что при synchronous = OFF дисковые операции должны завершаться мгновенно. Данные передаются в OS и управление тут же возврашается обратно. Собственно ввода-вывода никто ждать не должен.

Теоретически. Конкретный код (и версии), разумеется, может работать как-то неправильно и содержать баги. Вполне возможно, еще какие-то блокировки или миханизмы срабатывают. Нужно запускать конкретный код и как-то смотреть. что происходит.
====
P.S.
Сам использовал SQLite для сохранения десятков миллионов строк данных. Ничего даже не настраивал. Т.к. лично мне производительности вполне хватало
...
Рейтинг: 0 / 0
11.06.2019, 17:48
    #39825528
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Файловая БД SQLite в памяти.
YUBA....
должны взаимодействовать разные, даже не потоки, а приложения.
IMHO & AFAIK
Тогда SQLite странный выбор. Лучше взять полноценные БД (PostgreSQL, MySQL, Oracle etc)
...
Рейтинг: 0 / 0
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Файловая БД SQLite в памяти. / 25 сообщений из 33, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]