|
Как уменьшить нагрузку на жесткий диск?
|
|||
---|---|---|---|
#18+
Здравствуйте. У меня есть приложение, которое в некоторое количество потоков добавляет в базу данных некоторые значения на протяжении нескольких часов. Каждый поток добавляет значения в промежутке ~0,5 секунд. При большом количестве потоков "жужжание" диска неизбежно. Чтобы разгрузить жесткий диск, я создал дополнительный поток, в котором раз в пять секунд делаю commit и сразу begin transaction. Перед запуском потоков, я вызываю begin transaction, а после остановки всех потоков - commit. Является ли это решение хорошим? Есть ли решение моей проблемы на стороне SQLite? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2014, 20:52 |
|
Как уменьшить нагрузку на жесткий диск?
|
|||
---|---|---|---|
#18+
kangreon, что мешает куче потоков сохранять данные в потокобезопасный класс с буфером данных, который сбрасывается в базу раз в Х секунд? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2014, 21:39 |
|
Как уменьшить нагрузку на жесткий диск?
|
|||
---|---|---|---|
#18+
А что такое "потоки"? Эти потоки производят родственные данные (типа параллельных датчиков) или одно и тоже (типа счетчик обращений к веб-страничке)? В дальнейшем надо знать из какого "потока" пришла цифра или не надо? Часто используется двухзвеный процесс: "потоки" независимо друг от друга пишут свои данные в файлы (буферизация зависит от конкретного потока). Это дает возможность гибкого управления каждого потока и минимальный оверхед на накопительном файле. Особенно если разные потоки могут производить числа разного типа (например один выдает целые числа, а второй с плавающей запятой, третий вообще только флаг "да/нет"). И с некоей периодичностью запускается отдельный процесс который берет очередной файл, расшифровывает его в БД и стирает. А поток начинает набирать новый файл... Этот процесс даже может находится на другой машине чем "потоки". Это так же позволит иметь несколько читателей в БД параллельно с одним-единственным писателем. kangreonПеред запуском потоков, я вызываю begin transaction, а после остановки всех потоков - commit. Является ли это решение хорошим? Есть ли решение моей проблемы на стороне SQLite? Это ужасное решение. Если "потоки" подключаются к базе каждый по себе, то это вообще работать не будет. А если они идут через один общий синхронизирующий поток, то при частоте срабатывания потоков в полсекунду у тебя будет как минимум несколько секунд в каждой транзакции. А что если у тебя между begin и commit электричество вырубится? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.07.2014, 01:12 |
|
Как уменьшить нагрузку на жесткий диск?
|
|||
---|---|---|---|
#18+
Потоки (Thread) выполняют одинаковую работу и на выходи у них данные одинакового типа. Откуда пришли данные запоминать не нужно. Сейчас у меня все работает следующим образом: Создается подключение к базе данных и выполняются не связанные с вопросом действия, после чего выполняется begin transaction и запускаются потоки на получение некоторых данных. В потоки передается указатель на созданное подключение к базе данных. В потоках используется сritical section для синхронизации и добавления данных в базу, все остальные действия каждого потока выполняются вне критической секции. Та же самая критическая секция используется у меня и в дополнительном потоке, который выполняет все накопившиеся запросы к базе данных. Поток, каждую свою итерацию, заносит некоторое количество записей в одну таблицу и одно исправление в другую таблицу. Второе исправление - это текущее системное время, означающее последнее обновление данных. В связи с этим, проблема отключения питания во время begin transaction отпадает, т.к. потерянные данные можно будет получить при следующем запуске программы. (Если я правильно понимаю) ... |
|||
:
Нравится:
Не нравится:
|
|||
23.07.2014, 17:27 |
|
Как уменьшить нагрузку на жесткий диск?
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
23.07.2014, 19:09 |
|
Как уменьшить нагрузку на жесткий диск?
|
|||
---|---|---|---|
#18+
PPA, нет. При компиляции библиотеки была использована директива SQLITE_THREADSAFE=1 ... |
|||
:
Нравится:
Не нравится:
|
|||
23.07.2014, 22:33 |
|
Как уменьшить нагрузку на жесткий диск?
|
|||
---|---|---|---|
#18+
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-ы) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2014, 09:18 |
|
|
start [/forum/topic.php?fid=54&msg=38703311&tid=2008770]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
50ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
others: | 15ms |
total: | 158ms |
0 / 0 |