|
Нужен совет по реализации многопоточного приложения
|
|||
---|---|---|---|
#18+
Доброго времени суток, не хватает познаний в реализации. Имеется программа которая многопоточно опрашивает серверы, необходимо эти данные складывать в массив или в коллекцию для дальнейшей вставки в БД. Как лучше реализовать вставку всех данных с разных потоков в один массив и потом из массива в БД, ведь пока будет идти запрос вставки в БД, массив будет заполнятся. Заранее благодарен. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.05.2014, 11:39 |
|
Нужен совет по реализации многопоточного приложения
|
|||
---|---|---|---|
#18+
ConcurrentQueue ... |
|||
:
Нравится:
Не нравится:
|
|||
13.05.2014, 12:15 |
|
Нужен совет по реализации многопоточного приложения
|
|||
---|---|---|---|
#18+
Может проще вставлять из "много потоков" сразу в БД? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.05.2014, 15:32 |
|
Нужен совет по реализации многопоточного приложения
|
|||
---|---|---|---|
#18+
За ConcurrentQueue спасибо, не знал.... Алексей КМожет проще вставлять из "много потоков" сразу в БД? В таком случае буду тормозить потоки с данными или есть иной способ? Работаю с PostgreSQL ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2014, 05:56 |
|
Нужен совет по реализации многопоточного приложения
|
|||
---|---|---|---|
#18+
darlov, основная очередь - А у каждого потока своя небольшая очередь - Б потоки получая данные пишут сперва свою очередь (Б), как только в этой очереди, больше n записей (например 50) - поток пробует захватить локер очереди А, и быстренько сливает туда n записей. другой поток, к примеру раз в 5 секунд, заглядывает в очередь А, лочит её, и быстренько копирует в свою очередь С, и а "отпускает", после чего, не спеша, из очереди С все пишет в базу данных. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2014, 09:36 |
|
Нужен совет по реализации многопоточного приложения
|
|||
---|---|---|---|
#18+
Кифирчикdarlov, основная очередь - А у каждого потока своя небольшая очередь - Б потоки получая данные пишут сперва свою очередь (Б), как только в этой очереди, больше n записей (например 50) - поток пробует захватить локер очереди А, и быстренько сливает туда n записей. другой поток, к примеру раз в 5 секунд, заглядывает в очередь А, лочит её, и быстренько копирует в свою очередь С, и а "отпускает", после чего, не спеша, из очереди С все пишет в базу данных. А чем плох ConcurrentQueue? Каждый поток заполняет общий ConcurrentQueue методом Enqueue, а отдельный поток забирает оттуда методом TryDequeue (удаляя старые записи) и вставляет в БД оператором COPY ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2014, 09:45 |
|
Нужен совет по реализации многопоточного приложения
|
|||
---|---|---|---|
#18+
darlovВ таком случае буду тормозить потоки с даннымиВ противном случае очередь будет наполняться быстрее чем освобождаться, что приведёт к OutOfMemory ? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2014, 09:57 |
|
Нужен совет по реализации многопоточного приложения
|
|||
---|---|---|---|
#18+
darlov...А чем плох ConcurrentQueue?... я не говорю что он плох, лично руками ConcurrentQueue "не трогал", и её комментировать не могу ) ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2014, 10:16 |
|
Нужен совет по реализации многопоточного приложения
|
|||
---|---|---|---|
#18+
darlov В таком случае буду тормозить потоки с данными Рассматривайте поток как единицу работы. Алексей К В противном случае очередь будет наполняться быстрее чем освобождаться, что приведёт к OutOfMemory ? Имхо, слоны раньше сдохнут - чем куча иссякнет.. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2014, 10:28 |
|
Нужен совет по реализации многопоточного приложения
|
|||
---|---|---|---|
#18+
darlov, используемый провайдер поддерживаем для XXXCommand методы Begin/EndExecuteNonQuery? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2014, 11:03 |
|
Нужен совет по реализации многопоточного приложения
|
|||
---|---|---|---|
#18+
Где-то в степиАлексей К В противном случае очередь будет наполняться быстрее чем освобождаться, что приведёт к OutOfMemory ? Имхо, слоны раньше сдохнут - чем куча иссякнет..Кто знает. Продолжительность жизни слонов - 70-100 лет. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2014, 11:43 |
|
Нужен совет по реализации многопоточного приложения
|
|||
---|---|---|---|
#18+
Спасибо за ответы... Думаю надо тестировать в двух вариантах, не знаю как себя поведет проект при многопоточной вставке в БД большого объема данных... ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2014, 12:33 |
|
Нужен совет по реализации многопоточного приложения
|
|||
---|---|---|---|
#18+
Алексей ККто знает. Продолжительность жизни слонов - 70-100 лет. И они умирают от голода, когда стираются последние третьи зубы. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2014, 12:38 |
|
Нужен совет по реализации многопоточного приложения
|
|||
---|---|---|---|
#18+
Алексей КГде-то в степипропущено... Имхо, слоны раньше сдохнут - чем куча иссякнет..Кто знает. Продолжительность жизни слонов - 70-100 лет. так если рассуждать гипотетически, то уходя из дома на работу нужно прощаться с родными навсегда ( каждый раз).. хз, может и машина переехать, или скушать не того..., а приходя домой говорить - охя удача, я вернулся живым.. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2014, 15:34 |
|
Нужен совет по реализации многопоточного приложения
|
|||
---|---|---|---|
#18+
Кифирчикdarlov...А чем плох ConcurrentQueue?... я не говорю что он плох, лично руками ConcurrentQueue "не трогал", и её комментировать не могу ) Я пробовал. Ничем не плох. Наоборот, всем хорош :-). И лочить ничего не нужно. Если потоки генерируют данные быстрее, чем в состоянии переварить СУБД, то хоть как распределяй, накопление в очереди будет. Вариант, когда каждый поток сам пишет в БД рабочий, но лично мне не нравится размазывание функциональности. darlovкак себя поведет проект при многопоточной вставке в БД большого объема данных Зависит от СУБД. К тому же не озвучены критерии "большого" объема данных. Это сколько и как часто? Где-то в степито уходя из дома на работу нужно прощаться с родными навсегда ( каждый раз).. На самом деле это очень хороший совет. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2014, 15:40 |
|
Нужен совет по реализации многопоточного приложения
|
|||
---|---|---|---|
#18+
Где-то в степиАлексей Кпропущено... Кто знает. Продолжительность жизни слонов - 70-100 лет. так если рассуждать гипотетически, то уходя из дома на работу нужно прощаться с родными навсегда ( каждый раз).. хз, может и машина переехать, или скушать не того..., а приходя домой говорить - охя удача, я вернулся живым.. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2014, 15:47 |
|
Нужен совет по реализации многопоточного приложения
|
|||
---|---|---|---|
#18+
Arm79Вариант, когда каждый поток сам пишет в БД рабочий, но лично мне не нравится размазывание функциональности.Отнюдь. Всё зависит от написания программы. Ничто не мешает разделить запись в БД и опрос датчиков по разным классам. Один поток необязательно должен соответствовать одному классу. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2014, 15:54 |
|
Нужен совет по реализации многопоточного приложения
|
|||
---|---|---|---|
#18+
Алексей КНичто не мешает разделить запись в БД и опрос датчиков по разным классам Ничто не мешает. Но это может мне не нравиться? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2014, 15:57 |
|
Нужен совет по реализации многопоточного приложения
|
|||
---|---|---|---|
#18+
Arm79Алексей КНичто не мешает разделить запись в БД и опрос датчиков по разным классам Ничто не мешает. Но это может мне не нравиться?Конечно. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2014, 16:05 |
|
Нужен совет по реализации многопоточного приложения
|
|||
---|---|---|---|
#18+
Алексей К, можно, но не приветствую, имхо вставка должна осуществляться с одного места через буфер тем более если есть несколько претендентов на вставку в очереди, можно объединить их все в одну команду, и будет ли это быстрее чем вставка в каждой единице работы не известно, ибо есть такое ограничение ( из рихтера) из потоков обращение к куче может делать только один поток, остальные ждут, пока куча освободится, а пока ждут это и регистры сбрасываются, и кеш первого уровня очищается.... ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2014, 16:07 |
|
Нужен совет по реализации многопоточного приложения
|
|||
---|---|---|---|
#18+
Где-то в степиАлексей К, можно, но не приветствуюИ не надо. Достаточно огласить весь список, с преимуществами и недостатками возможных подходов. ТС пусть сам решает что ему больше подходит. Где-то в степи, имхо вставка должна осуществляться с одного места через буфер тем более если есть несколько претендентов на вставку в очереди, можно объединить их все в одну командуВ каждом потоке так же можно организовать объединение нескольких вставок в пакет (SQL batch). Где-то в степи, и будет ли это быстрее чем вставка в каждой единице работы не известноЕсли есть возможность объединить в пакеты (SQL batch), то вставка будет намного быстрее. Где-то в степи, ибо есть такое ограничение (из рихтера) из потоков обращение к куче может делать только один поток, остальные ждут, пока куча освободится, а пока ждут это и регистры сбрасываются, и кеш первого уровня очищается....Экономия на спичках. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2014, 16:20 |
|
Нужен совет по реализации многопоточного приложения
|
|||
---|---|---|---|
#18+
Алексей К, авторЭкономия на спичках. Имхо нет, писать эффективные потоки верх совершенства. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2014, 16:24 |
|
Нужен совет по реализации многопоточного приложения
|
|||
---|---|---|---|
#18+
Где-то в степиАлексей К, авторЭкономия на спичках. Имхо нет, писать эффективные потоки верх совершенства.Необходимость межпроцессного взаимодействия, в данном случае необходимость опроса серверов и записи в БД, сводит все эти оптимизации к нулю. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2014, 16:39 |
|
Нужен совет по реализации многопоточного приложения
|
|||
---|---|---|---|
#18+
Где-то в степиибо есть такое ограничение ( из рихтера) из потоков обращение к куче может делать только один поток, остальные ждут, пока куча освободится Ты что-то путаешь. Если бы потоки ждали бы своей очереди для доступа к куче, то не было бы никакой необходимости в lock и в других методах синхронизации. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2014, 18:35 |
|
Нужен совет по реализации многопоточного приложения
|
|||
---|---|---|---|
#18+
bazile, причем тут lock и синхронизация потоков? куча такой же разделяемый ресурс между потоками, как и то о чем вы думаете. только синхронизация доступом к куче управляется ядром системы, если один поток создает в куче что то new а другой пытается создать то же что то или изменить размер уже созданного что то, то система ставит эти потоки в очередь для обращения ( один изменяет, другой ждет) ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2014, 19:44 |
|
|
start [/forum/topic.php?fid=20&msg=38640638&tid=1402922]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
38ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
2ms |
others: | 11ms |
total: | 148ms |
0 / 0 |