powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Как уменьшить нагрузку на жесткий диск?
7 сообщений из 7, страница 1 из 1
Как уменьшить нагрузку на жесткий диск?
    #38703311
kangreon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте. У меня есть приложение, которое в некоторое количество потоков добавляет в базу данных некоторые значения на протяжении нескольких часов. Каждый поток добавляет значения в промежутке ~0,5 секунд. При большом количестве потоков "жужжание" диска неизбежно. Чтобы разгрузить жесткий диск, я создал дополнительный поток, в котором раз в пять секунд делаю commit и сразу begin transaction. Перед запуском потоков, я вызываю begin transaction, а после остановки всех потоков - commit.
Является ли это решение хорошим? Есть ли решение моей проблемы на стороне SQLite?
...
Рейтинг: 0 / 0
Как уменьшить нагрузку на жесткий диск?
    #38703337
fd00ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kangreon, что мешает куче потоков сохранять данные в потокобезопасный класс с буфером данных, который сбрасывается в базу раз в Х секунд?
...
Рейтинг: 0 / 0
Как уменьшить нагрузку на жесткий диск?
    #38703415
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что такое "потоки"? Эти потоки производят родственные данные (типа параллельных датчиков) или одно и тоже (типа счетчик обращений к веб-страничке)?
В дальнейшем надо знать из какого "потока" пришла цифра или не надо?


Часто используется двухзвеный процесс: "потоки" независимо друг от друга пишут свои данные в файлы (буферизация зависит от конкретного потока). Это дает возможность гибкого управления каждого потока и минимальный оверхед на накопительном файле. Особенно если разные потоки могут производить числа разного типа (например один выдает целые числа, а второй с плавающей запятой, третий вообще только флаг "да/нет").
И с некоей периодичностью запускается отдельный процесс который берет очередной файл, расшифровывает его в БД и стирает. А поток начинает набирать новый файл... Этот процесс даже может находится на другой машине чем "потоки". Это так же позволит иметь несколько читателей в БД параллельно с одним-единственным писателем.



kangreonПеред запуском потоков, я вызываю begin transaction, а после остановки всех потоков - commit.
Является ли это решение хорошим? Есть ли решение моей проблемы на стороне SQLite? Это ужасное решение. Если "потоки" подключаются к базе каждый по себе, то это вообще работать не будет. А если они идут через один общий синхронизирующий поток, то при частоте срабатывания потоков в полсекунду у тебя будет как минимум несколько секунд в каждой транзакции. А что если у тебя между begin и commit электричество вырубится?
...
Рейтинг: 0 / 0
Как уменьшить нагрузку на жесткий диск?
    #38704178
kangreon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Потоки (Thread) выполняют одинаковую работу и на выходи у них данные одинакового типа. Откуда пришли данные запоминать не нужно.
Сейчас у меня все работает следующим образом: Создается подключение к базе данных и выполняются не связанные с вопросом действия, после чего выполняется begin transaction и запускаются потоки на получение некоторых данных. В потоки передается указатель на созданное подключение к базе данных. В потоках используется сritical section для синхронизации и добавления данных в базу, все остальные действия каждого потока выполняются вне критической секции. Та же самая критическая секция используется у меня и в дополнительном потоке, который выполняет все накопившиеся запросы к базе данных. Поток, каждую свою итерацию, заносит некоторое количество записей в одну таблицу и одно исправление в другую таблицу. Второе исправление - это текущее системное время, означающее последнее обновление данных. В связи с этим, проблема отключения питания во время begin transaction отпадает, т.к. потерянные данные можно будет получить при следующем запуске программы. (Если я правильно понимаю)
...
Рейтинг: 0 / 0
Как уменьшить нагрузку на жесткий диск?
    #38704252
Фотография PPA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kangreon,

А вы встроенные в sqlite секции отключили?
http://www.sqlite.org/threadsafe.html
...
Рейтинг: 0 / 0
Как уменьшить нагрузку на жесткий диск?
    #38704363
kangreon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PPA, нет. При компиляции библиотеки была использована директива SQLITE_THREADSAFE=1
...
Рейтинг: 0 / 0
Как уменьшить нагрузку на жесткий диск?
    #38704516
Фотография PPA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kangreon,

А какой тип журнала используете? (вообще какие прагмы выполняются при открытии базы?)

Попробуйте активировать вот эту штуку - оно для вашего случая когда у процесса много потоков
http://sqlite.org/c3ref/enable_shared_cache.html

Если у вас своя крит секция используйте ее, а внутреннюю sqlite думаю можно отключить (хотя это на диск и не повлияет :)

Вот еще посмотрите примеры оптимизаций вставки
http://stackoverflow.com/questions/1711631/how-do-i-improve-insert-per-second-performance-of-sqlite

и в этой статье заметил что они юзают SQLITE_TRANSIENT.
Если много пишете строк, то рассмотрите возможность замены SQLITE_TRANSIENT на SQLITE_STATIC
тоже разгрузит CPU. (у вас ведь используются bind-ы)
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Как уменьшить нагрузку на жесткий диск?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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