Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / SQLite Новый топик    Ответить
 Подойдет ли мне SQLite ?  [new]
dundin
Member

Откуда:
Сообщений: 41
Доброго дня всем!
У меня есть задача: организовать взаимодействие некоторого числа (к примеру - 20) одновременно работающих программ с общими данными. Данных не много - в пределах 1МБ. Каждый из 20 экземпляров пишет в таблицу некоторые данные достаточно часто (к примеру - раз в секунду), и потом делает к этой таблице SQL-запрос.
Мне видится проблема в виде блокировок. Я поверхностно почитал про SQLite - когда идет запись - блокируется весь файл БД. Другие программы в этот момент не могут ни читать ни писать, ждут когда блокировка исчезнет. И мне видится что к примеру 20 программ, пишущих в базу некоторые данные с периодичностью раз в секунду будут мешать друг другу.
Повторюсь: данных не много, в основном - численные.
Получается - мне SQLite не подходит?

Если не подходит - посоветуйте альтернативы?
На самом деле, эти данные важны только первые 5 секунд. Потом они "прокисают") Я к тому что в идеале эта общая таблица должна висеть в оперативке, и все чтения и запись должны происходить в оперативке. Сохранность данных тут на последнем месте.
SQLite может конечно все держать в оперативке (in-memory), но такая in-memory БД будет для каждого экземпляра своя. А мне нужна общая для всех. Соответственно - это не вариант.
Далее: если таблица висит в оперативке - то у неё должен быть хозяин. Это уже сервер БД. Опять же - не хочется палить из пушки по воробьям - вместе с программой распространять еще и полновесный "условный MySQL".

Натолкните пожалуйста на правильные мысли.
18 фев 19, 15:53    [21813222]     Ответить | Цитировать Сообщить модератору
 Re: Подойдет ли мне SQLite ?  [new]
White Owl
Member

Откуда:
Сообщений: 12390
Массив в памяти блокируемый мутексом (или несколькими) и все. СУБД для этой задачи нафиг не нужен.
18 фев 19, 16:53    [21813383]     Ответить | Цитировать Сообщить модератору
 Re: Подойдет ли мне SQLite ?  [new]
dundin
Member

Откуда:
Сообщений: 41
White Owl
Массив в памяти блокируемый мутексом (или несколькими) и все. СУБД для этой задачи нафиг не нужен.


Какие слова гуглить?)
Программа написана на Delphi.
18 фев 19, 17:01    [21813409]     Ответить | Цитировать Сообщить модератору
 Re: Подойдет ли мне SQLite ?  [new]
Dima T
Member

Откуда:
Сообщений: 13939
SQLite в чистом виде тут не лучший вариант, т.к. обмен будет через дисковую подсистему, что лишние тормоза.

Если размер "БД" заранее известен (хотя бы максимум), то гугли "shared memory" и "именованный мьютекс"

Можно пойти другим путем: сделать отдельный процесс для сервера БД, внутри sqlite c in-memory. Все остальные обращаются к нему через какие-то каналы обмена (TCP, PIPE и т.п.), т.е. передают ему свежую инфу и периодически получают общее состояние. Если пойдешь этим путем можешь глянуть ZeroMQ
18 фев 19, 17:49    [21813487]     Ответить | Цитировать Сообщить модератору
 Re: Подойдет ли мне SQLite ?  [new]
dundin
Member

Откуда:
Сообщений: 41
Dima T , White Owl Спасибо за ответы!
Я забыл добавить, что экземпляры программ могут перезагружаться.
Пока мысль льется в таком направлении:
1. Если копать в сторону Shared Memory. Насколько я понимаю - один из экземпляров должен создать этот кусок Shared Memory.
Соответственно, когда создатель этого куска перезагрузится - кусок Shared Memory тоже пропадет. Не будет же бесхозный кусок памяти висеть в памяти. С другой стороны - можно при каждом обращении каждым экземпляром проверять наличие и если его нет - создавать и грузить туда данные. Сработает интересно?

2. Вариант с неким "диспетчером" - отдельный экземпляр, который работает в режиме сервера. Всем хорош. Но диспетчер всегда должен работать. А что если он отрубился по каким то причинам? Конечно вариант без диспетчера - более красив и гибок, но более гемороен , ибо при вставки данных в эту общую таблицу требуется функциональность SQL, поддержка уникальности ключей.
Ну и с SQL - ем работать просто привычней.
18 фев 19, 18:27    [21813573]     Ответить | Цитировать Сообщить модератору
 Re: Подойдет ли мне SQLite ?  [new]
Dima T
Member

Откуда:
Сообщений: 13939
dundin
1. Если копать в сторону Shared Memory. Насколько я понимаю - один из экземпляров должен создать этот кусок Shared Memory.
Соответственно, когда создатель этого куска перезагрузится - кусок Shared Memory тоже пропадет. Не будет же бесхозный кусок памяти висеть в памяти. С другой стороны - можно при каждом обращении каждым экземпляром проверять наличие и если его нет - создавать и грузить туда данные. Сработает интересно?

Не угадал, кусок существует до тех пор пока его используют, и неважно кто его создал. Гугли, а лучше Рихтера почитай.

dundin
2. Вариант с неким "диспетчером" - отдельный экземпляр, который работает в режиме сервера. Всем хорош. Но диспетчер всегда должен работать. А что если он отрубился по каким то причинам? Конечно вариант без диспетчера - более красив и гибок, но более гемороен , ибо при вставки данных в эту общую таблицу требуется функциональность SQL, поддержка уникальности ключей.
Ну и с SQL - ем работать просто привычней.

Тут ты сам должен следить чтоб не отрубился. Не может прога диспетчеру отправить, проверяет что он умер, или если завис, то убивает и запускает нового диспетчера.
18 фев 19, 18:40    [21813594]     Ответить | Цитировать Сообщить модератору
 Re: Подойдет ли мне SQLite ?  [new]
Соискатель С++
Member

Откуда:
Сообщений: 31
Известные мне сетевые БД (Firebird, PostgreSQL, MySQL) легко справятся с этой задачей, 1 Мб всегда будет в кэше
+ Легкая реализация стандартными компонентами
+ Масштабирование по сети
- Надо ставить программу сервера БД

Известные мне файловые БД (Clarion, FoxPro, DBase) тоже легко с этим справятся
+ Масштабирование по сети через общий диск
+ Ничего ставить не надо
- Морально устаревшая технология

При выборе этих вариантов нужно изучить, как в конкретной БД обстоят дела с удалением мусора, иначе файл может быстро расти.

Если все экземпляры программы всегда работают только на одном компьютере, то, имхо,
* может пересмотреть архитектуру, и вообще все сделать в одной программе
* может пересмотреть архитектуру, и вообще все сделать без БД, например общая память, или каждый экземпляр хранит свой набор данных и при обновлении оповещает всех с помощью ZeroMQ, или один процесс все хранит и всем раздает

Вариант с общей памятью самый быстрый, но, прямое использование Windows API, на мой взгляд, большой минус.
19 фев 19, 09:15    [21813949]     Ответить | Цитировать Сообщить модератору
 Re: Подойдет ли мне SQLite ?  [new]
tchingiz
Member

Откуда:
Сообщений: 33908
Dima T,

это мы такое тоже вычитали из книжки то?

автор
почитал про SQLite - когда идет запись - блокируется весь файл БД.
19 фев 19, 10:09    [21813996]     Ответить | Цитировать Сообщить модератору
 Re: Подойдет ли мне SQLite ?  [new]
Dima T
Member

Откуда:
Сообщений: 13939
tchingiz
Dima T,

это мы такое тоже вычитали из книжки то?

автор
почитал про SQLite - когда идет запись - блокируется весь файл БД.

Да, для записи блокировка всей БД. В книжке стр. 131 п. 6.3.4 "Пишущие Транзакции"
19 фев 19, 10:16    [21814003]     Ответить | Цитировать Сообщить модератору
 Re: Подойдет ли мне SQLite ?  [new]
Dima T
Member

Откуда:
Сообщений: 13939
Соискатель С++
Вариант с общей памятью самый быстрый, но, прямое использование Windows API, на мой взгляд, большой минус.

Не вижу ничего криминального в использовании WinAPI.
Скорее всего в дельфи есть уже что-нибудь готовое по этой теме, компоненты какие-нибудь и т.п. Тема не такая уж экзотическая. Это в форуме по дельфи лучше уточнить.
19 фев 19, 10:44    [21814046]     Ответить | Цитировать Сообщить модератору
 Re: Подойдет ли мне SQLite ?  [new]
tunknown
Member

Откуда:
Сообщений: 678
dundin
и потом делает к этой таблице SQL-запрос.
Сложный ли запрос? Директорией с файлами нельзя обойтись через FindFirst/FindNext с wildcard? Если запись невелика можно обойтись даже (путём+)именем файла в качестве строки данных с пустым телом. Длиной до 260 символов при обычном упрощённом доступе. В атрибутах есть ещё несколько полей, например, время создания и т.п.
21 фев 19, 17:57    [21816684]     Ответить | Цитировать Сообщить модератору
 Re: Подойдет ли мне SQLite ?  [new]
982183
Member

Откуда: VL
Сообщений: 3109
Датчики?
22 фев 19, 03:58    [21816957]     Ответить | Цитировать Сообщить модератору
 Re: Подойдет ли мне SQLite ?  [new]
unregestered
Member

Откуда:
Сообщений: 397
Писать раз в секунду - это вообще ни о чём. SQLite сотни тысяч таких операций в секунду может сделать.
Если совсем много конкурентных записей надо то читать здесь: https://www.sqlite.org/wal.html
8 апр 19, 16:25    [21856164]     Ответить | Цитировать Сообщить модератору
Все форумы / SQLite Ответить