2013-05-22 3 views
1

Я разрабатываю приложение на фондовом рынке в виде окон с использованием .net framework 4.0. Я извлекаю тики из обмена в реальном времени. Я могу получать тики в режиме реального времени. В моем сценарии мне нужно создать поток, который будет писать в реальном времени фиды в общей коллекции & другой непрерывный фоновый поток будет извлекать его из коллекции & делает дальнейшую обработку. Для этого я использую комбинацию ConcurrentDictionary и ConcurrentQueue. Имя символа конатинов & Значение содержит ConcurrentQueue. Так оно и было реализовано. Check first answerКак хранить данные в реальном времени

Это прекрасно работает, моя единственная забота - это задержка. Этот процесс вызывает задержку в 1 секунду, поскольку цены на акции должны колебаться в режиме реального времени. Может ли этот сценарий быть реализован какой-то другой логикой или я могу каким-то образом улучшить производительность ConcurrentDictionary или ConcurrentQueue, чтобы избежать задержек?

+0

Вы не сделали никакого диагноза. Начните с основ: что именно вызывает задержка? Конфликт блокировки или другие накладные расходы синхронизации? Или ваша собственная обработка? – millimoose

+0

(Если это не C#, и если вам не нужна архивирование данных, я бы предложил посмотреть на rrdtool, который представляет собой базу данных, явно предназначенную для хранения фиксированного количества записей с высокой производительностью.) – millimoose

+0

Запись или чтение from concurrentDictionary или concurrentqueue вызывает задержку – Tuscan

ответ

3

Вам действительно нужен параллельный словарь? Ваш словарь изменяется только тогда, когда вы находите новый символ. Если вам известны все символы заранее, вы можете создать обычный словарь, заполнить его очередью на символ, и это все - словарь никогда не изменится дальше этого.

Я не уверен, как работает поток обработки, - как он узнает, в какую очередь смотреть дальше? Перебирает ли он все очереди, чтобы узнать, есть ли еще данные? Возможно, вам нужно всего лишь один ConcurrentQueue, который проведет все события на фондовом рынке и разделит его на отдельные контейнеры в фоновом режиме (возможно, без синхронизации).

+0

Если я использую обычный словарь, он будет потокобезопасным, так как несколько потоков будут выдавать и деинсталлировать данные из очереди. – Tuscan

+1

Обычный словарь безопасен для одновременных операций чтения, если никто его не изменяет. Вы не меняете словарь, просто очереди - словарь все тот же. – zmbq

1

Почему бы вам не задать объект, содержащий идентификатор stmbol и соответствующую страницу, удалить его рабочими потоками (без назначения выделенного потока каждому идентификатору символа), а затем рабочий поток отправит страницу в правильная обработка в зависимости от идентификатора символа с помощью простого оператора case switch.

Таким образом, вам не нужно проверять наличие очереди для символа. У вас будет только одна потокобезопасная очередь типа И вы можете использовать ThreadPool для обработки!

рабочие потоки будут делать это:

IdPagePair pair = market.Dequeue(); 

if (pair.Id == 1) { Process1(pair.Page); } 

else 

if (pair.Id == 2) { Process2(pair.Page); } 

// etc... 
+0

Что вы подразумеваете под «парой»? – Tuscan

+0

пара будет классом с двумя свойствами: идентификатором символа и ассоциированной страницей. –

Смежные вопросы