|
"Параллельные вычисления" - реализация С#
|
|||
---|---|---|---|
#18+
Насчет "параллельных", возможно термин выбран не совсем удачно. Но элементы присутствуют. Имеем COM-объект в котором происходят около 10-ка различных событий с частотой от нескольких в мин до десятков в сек. Пока работаю с тремя из них. Мы подписаны на эти события, и по каждому из них получаем некий поток данных, где-то около 10-20 как-то упакованных параметров. Уже понятно, что обработать их в реальном масштабе времени нереально. Поэтому обработчики событий сделаны оч легкими и просто преобразуют данные в объект и укладывают их в стек. Используется коллекция. (Реализовано) Пока предполагается (нереализовано) , что организуем 3 потока, которые считывают [0] элемент коллекции (если таковой существует), удаляют его из коллекции и далее обрабатывают. Поток события в тоже самое время приостанавливает поток обработчика стека и кладет в коллекцию (стек) следующие элементы. И далее по кругу. Собственно, мы получаем совместный доступ к изменению данных - 1. добавление элемента, запись 2.чтение, удаление элемента. Нужна какая-то организация этого процесса, какие-то флаги и обмен ими. Приоритет у обработчика событий. Обработчик стека может и подождать. Ничего вразумительного о построении таких систем пока не нашел. Ищу. Если кто знает как это организуется, буду признателен за любую инфу. "Есть многое на свете, друг Горацио, что и не сразу в голову придет." М. Твен "Приключения Геккельбери Финна" ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2012, 20:39 |
|
"Параллельные вычисления" - реализация С#
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2012, 00:09 |
|
"Параллельные вычисления" - реализация С#
|
|||
---|---|---|---|
#18+
YUBAНасчет "параллельных", возможно термин выбран не совсем удачно. Но элементы присутствуют. Имеем COM-объект в котором происходят около 10-ка различных событий с частотой от нескольких в мин до десятков в сек. Пока работаю с тремя из них. Мы подписаны на эти события, и по каждому из них получаем некий поток данных, где-то около 10-20 как-то упакованных параметров. Уже понятно, что обработать их в реальном масштабе времени нереально. Поэтому обработчики событий сделаны оч легкими и просто преобразуют данные в объект и укладывают их в стек. Используется коллекция. (Реализовано) Пока предполагается (нереализовано) , что организуем 3 потока, которые считывают [0] элемент коллекции (если таковой существует), удаляют его из коллекции и далее обрабатывают. Поток события в тоже самое время приостанавливает поток обработчика стека и кладет в коллекцию (стек) следующие элементы. И далее по кругу. Собственно, мы получаем совместный доступ к изменению данных - 1. добавление элемента, запись 2.чтение, удаление элемента. Нужна какая-то организация этого процесса, какие-то флаги и обмен ими. Приоритет у обработчика событий. Обработчик стека может и подождать. Ничего вразумительного о построении таких систем пока не нашел. Ищу. Если кто знает как это организуется, буду признателен за любую инфу. "Есть многое на свете, друг Горацио, что и не сразу в голову придет." М. Твен "Приключения Геккельбери Финна" См dataflow. Для подобных задач - то, что доктор ordered ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2012, 00:20 |
|
"Параллельные вычисления" - реализация С#
|
|||
---|---|---|---|
#18+
bazile, SeVa, Спасибо, буду смотреть. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2012, 01:05 |
|
"Параллельные вычисления" - реализация С#
|
|||
---|---|---|---|
#18+
После прочтения глав Рихтера "CLR via C#", пока предварительно решил не связываться с синхронизацией потоков. Оч уж большие издержки при приостановке потоков, что у него (Рихтера) и написано. Пока попробую следующее. Потоку передается объект содержащий коллекцию ListArray, кол-во данных для считывания и флаги состояния потока. После считывания заданного кол-ва данных поток устанавливает флаг окончания работы с коллекцией. Основной поток события проверяет флаг, удаляет из начала коллекции уже ненужные считанные данные и передает потоку новое кол-во данных и флаг продолжения задачи. Далее по кругу. Один пишет, другой читает. Никакой конкуренции, синхронизации и приостановки потока. Завтра (уже сегодня) начну делать. Данных оказалось значительно больше, чем предполагалось. По каждому из событию приходит где-то до 500 параметров. bazile , отдельное спасибо за книгу. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2012, 01:16 |
|
"Параллельные вычисления" - реализация С#
|
|||
---|---|---|---|
#18+
YUBA, ну у вас же была верная мысль в начале, стек, я бы конечно выбрал очередь ( первым поступил первым обработался) ибо если голова будет расти и обработчик не будет успевать, нижние слои могут прокиснуть, в плане актуальности просто залочте работу с очередью у будут атомарные операции, поставить - выхватить из очереди. один поток пишет в голову другой читает с конца.. если будете брать потоки из пула, затрат на создание почти никаких. Рихтер наверное это имел ввиду, даже если учесть, что приложение однопоточное всё равно планировщик будет его кое где рвать и потоку придется упаковываться в стек для продолжения, так что один или два потока, это экономия на спичках, в плане нагрузки на систему, операции работы с объектом как ни крути тоже будете делать в стеке потока, там вообще просто, смещение и память чиста, ну сам обьект из кучи - очистка памяти убьет когда надо, можете помочь в этом деле, что бы не вызывать конструктор отдиспозьте его (IDispose) в прочем не знаю в каком виде встают ваши задания в очередь.. единственное что можно подумать как поток обработчик ( по каким сигналам будет лазить в стек или в очередь) ну тут можно придумать кучу вариантов, я бы остановился на принципе как дышат соккеты.. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2012, 03:32 |
|
"Параллельные вычисления" - реализация С#
|
|||
---|---|---|---|
#18+
YUBAУже понятно, что обработать их в реальном масштабе времени нереально. Поэтому обработчики событий сделаны оч легкими и просто преобразуют данные в объект и укладывают их в стек. Используется коллекция. (Реализовано) попробуйте просто порождать события асинхронно, т.е. типа ThreadPool.QueueUserWorkItem(FireYourEvent) Где-то в степи уже сказал что пул потоков весьма шустр, не сомневаюсь что получится гораздо шустрей чем с использованием коллекции (обязательные локи). ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2012, 12:19 |
|
"Параллельные вычисления" - реализация С#
|
|||
---|---|---|---|
#18+
Где-то в степи, LR Наверно немного не поняли, или я не понял. Событие постоянно кладет на верх ArrayList, поток постоянно читает снизу. Событие передает потоку текущий размер коллекции, по флагу окончания цикла чтения потоком. И продолжает дополнять коллекцию сверху. Поток читает данные от 0 до переданного размера, выставляет флаг окончания чтения и уходит в бесконечный цикл до следующего получения размера коллекции. Событие по флагу окончания чтения удаляет уже считанные элементы ArrayList и опять передает потоку текущий размер. И по кругу. Проблема c FIFO (класс Queue) м.б. в возможности одновременного добавлении элемента и удалении первого потоком и необходимости синхронизации этого момента. А с пулом потоков, да, один из вариантов. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2012, 14:58 |
|
"Параллельные вычисления" - реализация С#
|
|||
---|---|---|---|
#18+
YUBA, Чем не нравится синхронизация ( основа работы с общими данными)? вы хотите сказать что у вас ее нет? у вас ее еще больше, и она еще более запутана. выкиньте ваш флаг, размер коллекции уже есть флаг, очередь пустая - обработчик крутится в холостую. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2012, 15:14 |
|
"Параллельные вычисления" - реализация С#
|
|||
---|---|---|---|
#18+
и почему у вас очередь очищают события, очередь должны очищать обработчики, -> выхватил обьект из очереди-> обработал его => снова полез проверять, есть ли для меня работа. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2012, 15:17 |
|
"Параллельные вычисления" - реализация С#
|
|||
---|---|---|---|
#18+
YUBAСобытие постоянно кладет на верх ArrayList, поток постоянно читает снизу. ну вот, и почему бы под каждую "кладку" не выделить свой поток? тогда этому потоку вроде как не надо ни с кем синхронизироваться, обработал "кладку" - и обратно в пул, не? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2012, 15:23 |
|
"Параллельные вычисления" - реализация С#
|
|||
---|---|---|---|
#18+
LR, потому что пул потоков, имеет ограничения по количеству. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2012, 15:24 |
|
"Параллельные вычисления" - реализация С#
|
|||
---|---|---|---|
#18+
Где-то в степиLR, потому что пул потоков, имеет ограничения по количеству. ну и что? на что это повлияет? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2012, 15:27 |
|
"Параллельные вычисления" - реализация С#
|
|||
---|---|---|---|
#18+
LR, в этой задаче ( конкретной этой- ни на что) тут можно и тупо обойтись без всяких листов, и под каждый чих события, делать begininvoke ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2012, 15:39 |
|
"Параллельные вычисления" - реализация С#
|
|||
---|---|---|---|
#18+
Где-то в степи, совершенно верно, если есть возможность засунуть "каждый чих" в отдельный поток, то так и следует поступать в условиях "в реальном масштабе времени" ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2012, 15:45 |
|
"Параллельные вычисления" - реализация С#
|
|||
---|---|---|---|
#18+
LRГде-то в степи, совершенно верно, если есть возможность засунуть "каждый чих" в отдельный поток, то так и следует поступать в условиях "в реальном масштабе времени"То, что сейчас делаю, называется - "конвейер". Никакой конкуренции между событием и потоком просто не существует. Если успевать не будет, буду думать о распараллеливании по потокам. А с пулом м.б. даже сегодня попробую. ЗЫ СОМ-объект, зараза, по событию выдает мне не обновление, а всю, местами изменившуюся, таблицу параметров. Надо "виртуальную" БД делать, чтобы по insert-update только изменившиеся строки писать. Хотя все равно SQL-сервер цеплять. Вот и еще поток, в фоновом режиме в SQL-сервер инфу толкать. + пользовательские интефейсы, таблицы, алармы, графики, строить. У National Instrumens есть среда LabView для подобных задач, но она здесь, к сожалению, не прокатывает. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2012, 16:14 |
|
"Параллельные вычисления" - реализация С#
|
|||
---|---|---|---|
#18+
YUBAХотя все равно SQL-сервер цеплять. Вот и еще поток, в фоновом режиме в SQL-сервер инфу толкать. хм... если это мсскл2008, то там есть табличные параметры и я бы попробовал эту "всю, местами изменившуюся, таблицу параметров" сразу отгружать скл-серверу (обрабатывать уже в хп) ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2012, 16:26 |
|
"Параллельные вычисления" - реализация С#
|
|||
---|---|---|---|
#18+
YUBA, я подозреваю что вы пишете обработчик трейдерского стакана ( биржа) там действительно прилетает с СОМ реальная таблица актуальных данных порядка 12-20 раз в секунд. смею вас уверить никакого потока не надо, все делается в одном контексте, и вставляется в обыкновенный грид как это исполнить я как то показывал, многие сетовали что грид тормозной, ничего подобного обновлялся в 20 раз в секунду мало того я успевал разукрасить его, произвести кое какие расчеты, вставить в грид текущие заявки, и сделать анализ тренда, и все это на дух ядрах. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2012, 16:34 |
|
"Параллельные вычисления" - реализация С#
|
|||
---|---|---|---|
#18+
Где-то в степи, HFT пишу, пока модель для отработки. Кроме стакана, сделки + 1 мин ТФ. Не забудь, что это все еще обсчитывать надо. Люди, вообще-то, спец. платы в компьютер вставляют. Народ на конференции по алготрейдингу говорил, что Винда не успевает, но подробности, ясно дело, никто не говорит. Судя по уже полученным таблицам, сделок в обычном режиме где-то ~50/c. Вся таблица где-то ~500 строк. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2012, 17:50 |
|
"Параллельные вычисления" - реализация С#
|
|||
---|---|---|---|
#18+
YUBA, высокочастотную торговлю, по интернету, хм, жалко .. как вы себе представляете, с нестабильной плазой, с недостоверными данными ( почитайте редбула), конце концов с простым обманом, когда меркетмейкеры встают просто перед вами, хотя биржа и предлагает размещать высокочастотные роботы у себя на площадке ( напрямую) вызывает сомнение.( в стране где все построено на обмане вдруг появилась честная биржа с честным регулятором, один штраф которого 10 000 рублей за не добросовестные проведение следок, вызывает нервный хохот) а по теме, как вы это себе представляете, приходит информация с сом, вы всю обработку засовываете в отдельный поток поток обрабатывает дает сигнал в лонг, а там уже далеко не лонг - уже в это время прострелило 8-10 событий и тренд против вас. Всю обработку надо делать в контексте события сома, а не разбрасывать по разным потокам. не хватает мощи, расширяйте железо, подключайте видеокарту ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2012, 18:11 |
|
"Параллельные вычисления" - реализация С#
|
|||
---|---|---|---|
#18+
Где-то в степиYUBA, высокочастотную торговлю, по интернету, хм, жалко .. как вы себе представляете, с нестабильной плазой, с недостоверными данными ( почитайте редбула), конце концов с простым обманом, когда меркетмейкеры встают просто перед вами, хотя биржа и предлагает размещать высокочастотные роботы у себя на площадке ( напрямую) вызывает сомнение.( в стране где все построено на обмане вдруг появилась честная биржа с честным регулятором, один штраф которого 10 000 рублей за не добросовестные проведение следок, вызывает нервный хохот) а по теме, как вы это себе представляете, приходит информация с сом, вы всю обработку засовываете в отдельный поток поток обрабатывает дает сигнал в лонг, а там уже далеко не лонг - уже в это время прострелило 8-10 событий и тренд против вас. Всю обработку надо делать в контексте события сома, а не разбрасывать по разным потокам. не хватает мощи, расширяйте железо, подключайте видеокарту 1.Не надо лезть на фьюч РТС, там этих HFT как грязи. И я им не конкурент, по определению. :) 2. Фьючи ГП И Сбер тоже весьма неплохие инструменты, и более спокойные. Даже руками вполне успеваешь пипсовать - минимум 400-500 п за день, это если в струю не попадешь, но оч утомительно, да и время занимает. И, в общем, практически нереально заниматься постоянно. Только в порядке хобби. 3. Конвеерные вычисления всегда были наиболее быстрыми, а удалить низ коллекции и поднять флаг, времени вообще не занимает, по сравнению с управлением потоками. Тот-же Рихтер пишет, что времени на это уходит уйма и рекомендует по возможности разделять доступ - один только запись - другой только чтение. Что и реализовано. А вот если монопоток чего-то не успеет, мы вообще часть событий потеряем. Событий, кстати, около десятка предполагается. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2012, 19:06 |
|
|
start [/forum/topic.php?fid=20&msg=38066743&tid=1405538]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
64ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
others: | 329ms |
total: | 486ms |
0 / 0 |