|
Подойдет ли мне SQLite ?
|
|||
---|---|---|---|
#18+
Доброго дня всем! У меня есть задача: организовать взаимодействие некоторого числа (к примеру - 20) одновременно работающих программ с общими данными. Данных не много - в пределах 1МБ. Каждый из 20 экземпляров пишет в таблицу некоторые данные достаточно часто (к примеру - раз в секунду), и потом делает к этой таблице SQL-запрос. Мне видится проблема в виде блокировок. Я поверхностно почитал про SQLite - когда идет запись - блокируется весь файл БД. Другие программы в этот момент не могут ни читать ни писать, ждут когда блокировка исчезнет. И мне видится что к примеру 20 программ, пишущих в базу некоторые данные с периодичностью раз в секунду будут мешать друг другу. Повторюсь: данных не много, в основном - численные. Получается - мне SQLite не подходит? Если не подходит - посоветуйте альтернативы? На самом деле, эти данные важны только первые 5 секунд. Потом они "прокисают") Я к тому что в идеале эта общая таблица должна висеть в оперативке, и все чтения и запись должны происходить в оперативке. Сохранность данных тут на последнем месте. SQLite может конечно все держать в оперативке (in-memory), но такая in-memory БД будет для каждого экземпляра своя. А мне нужна общая для всех. Соответственно - это не вариант. Далее: если таблица висит в оперативке - то у неё должен быть хозяин. Это уже сервер БД. Опять же - не хочется палить из пушки по воробьям - вместе с программой распространять еще и полновесный "условный MySQL". Натолкните пожалуйста на правильные мысли. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2019, 15:53 |
|
Подойдет ли мне SQLite ?
|
|||
---|---|---|---|
#18+
Массив в памяти блокируемый мутексом (или несколькими) и все. СУБД для этой задачи нафиг не нужен. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2019, 16:53 |
|
Подойдет ли мне SQLite ?
|
|||
---|---|---|---|
#18+
White OwlМассив в памяти блокируемый мутексом (или несколькими) и все. СУБД для этой задачи нафиг не нужен. Какие слова гуглить?) Программа написана на Delphi. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2019, 17:01 |
|
Подойдет ли мне SQLite ?
|
|||
---|---|---|---|
#18+
SQLite в чистом виде тут не лучший вариант, т.к. обмен будет через дисковую подсистему, что лишние тормоза. Если размер "БД" заранее известен (хотя бы максимум), то гугли "shared memory" и "именованный мьютекс" Можно пойти другим путем: сделать отдельный процесс для сервера БД, внутри sqlite c in-memory. Все остальные обращаются к нему через какие-то каналы обмена (TCP, PIPE и т.п.), т.е. передают ему свежую инфу и периодически получают общее состояние. Если пойдешь этим путем можешь глянуть ZeroMQ ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2019, 17:49 |
|
Подойдет ли мне SQLite ?
|
|||
---|---|---|---|
#18+
Dima T , White Owl Спасибо за ответы! Я забыл добавить, что экземпляры программ могут перезагружаться. Пока мысль льется в таком направлении: 1. Если копать в сторону Shared Memory. Насколько я понимаю - один из экземпляров должен создать этот кусок Shared Memory. Соответственно, когда создатель этого куска перезагрузится - кусок Shared Memory тоже пропадет. Не будет же бесхозный кусок памяти висеть в памяти. С другой стороны - можно при каждом обращении каждым экземпляром проверять наличие и если его нет - создавать и грузить туда данные. Сработает интересно? 2. Вариант с неким "диспетчером" - отдельный экземпляр, который работает в режиме сервера. Всем хорош. Но диспетчер всегда должен работать. А что если он отрубился по каким то причинам? Конечно вариант без диспетчера - более красив и гибок, но более гемороен , ибо при вставки данных в эту общую таблицу требуется функциональность SQL, поддержка уникальности ключей. Ну и с SQL - ем работать просто привычней. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2019, 18:27 |
|
Подойдет ли мне SQLite ?
|
|||
---|---|---|---|
#18+
dundin1. Если копать в сторону Shared Memory. Насколько я понимаю - один из экземпляров должен создать этот кусок Shared Memory. Соответственно, когда создатель этого куска перезагрузится - кусок Shared Memory тоже пропадет. Не будет же бесхозный кусок памяти висеть в памяти. С другой стороны - можно при каждом обращении каждым экземпляром проверять наличие и если его нет - создавать и грузить туда данные. Сработает интересно? Не угадал, кусок существует до тех пор пока его используют, и неважно кто его создал. Гугли, а лучше Рихтера почитай . dundin2. Вариант с неким "диспетчером" - отдельный экземпляр, который работает в режиме сервера. Всем хорош. Но диспетчер всегда должен работать. А что если он отрубился по каким то причинам? Конечно вариант без диспетчера - более красив и гибок, но более гемороен , ибо при вставки данных в эту общую таблицу требуется функциональность SQL, поддержка уникальности ключей. Ну и с SQL - ем работать просто привычней. Тут ты сам должен следить чтоб не отрубился. Не может прога диспетчеру отправить, проверяет что он умер, или если завис, то убивает и запускает нового диспетчера. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2019, 18:40 |
|
Подойдет ли мне SQLite ?
|
|||
---|---|---|---|
#18+
Известные мне сетевые БД (Firebird, PostgreSQL, MySQL) легко справятся с этой задачей, 1 Мб всегда будет в кэше + Легкая реализация стандартными компонентами + Масштабирование по сети - Надо ставить программу сервера БД Известные мне файловые БД (Clarion, FoxPro, DBase) тоже легко с этим справятся + Масштабирование по сети через общий диск + Ничего ставить не надо - Морально устаревшая технология При выборе этих вариантов нужно изучить, как в конкретной БД обстоят дела с удалением мусора, иначе файл может быстро расти. Если все экземпляры программы всегда работают только на одном компьютере, то, имхо, * может пересмотреть архитектуру, и вообще все сделать в одной программе * может пересмотреть архитектуру, и вообще все сделать без БД, например общая память, или каждый экземпляр хранит свой набор данных и при обновлении оповещает всех с помощью ZeroMQ, или один процесс все хранит и всем раздает Вариант с общей памятью самый быстрый, но, прямое использование Windows API, на мой взгляд, большой минус. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2019, 09:15 |
|
Подойдет ли мне SQLite ?
|
|||
---|---|---|---|
#18+
Dima T, это мы такое тоже вычитали из книжки то? авторпочитал про SQLite - когда идет запись - блокируется весь файл БД. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2019, 10:09 |
|
Подойдет ли мне SQLite ?
|
|||
---|---|---|---|
#18+
tchingizDima T, это мы такое тоже вычитали из книжки то? авторпочитал про SQLite - когда идет запись - блокируется весь файл БД. Да, для записи блокировка всей БД. В книжке стр. 131 п. 6.3.4 "Пишущие Транзакции" ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2019, 10:16 |
|
Подойдет ли мне SQLite ?
|
|||
---|---|---|---|
#18+
Соискатель С++Вариант с общей памятью самый быстрый, но, прямое использование Windows API, на мой взгляд, большой минус. Не вижу ничего криминального в использовании WinAPI. Скорее всего в дельфи есть уже что-нибудь готовое по этой теме, компоненты какие-нибудь и т.п. Тема не такая уж экзотическая. Это в форуме по дельфи лучше уточнить. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2019, 10:44 |
|
Подойдет ли мне SQLite ?
|
|||
---|---|---|---|
#18+
dundinи потом делает к этой таблице SQL-запрос.Сложный ли запрос? Директорией с файлами нельзя обойтись через FindFirst/FindNext с wildcard? Если запись невелика можно обойтись даже (путём+)именем файла в качестве строки данных с пустым телом. Длиной до 260 символов при обычном упрощённом доступе. В атрибутах есть ещё несколько полей, например, время создания и т.п. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2019, 17:57 |
|
Подойдет ли мне SQLite ?
|
|||
---|---|---|---|
#18+
Писать раз в секунду - это вообще ни о чём. SQLite сотни тысяч таких операций в секунду может сделать. Если совсем много конкурентных записей надо то читать здесь: https://www.sqlite.org/wal.html ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2019, 16:25 |
|
|
start [/forum/topic.php?fid=54&msg=39777476&tid=2008401]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
54ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
others: | 270ms |
total: | 414ms |
0 / 0 |