2012-03-29 2 views
0

Я новичок в обработке передачи многоадресной передачи, мой вопрос - это лучший способ создать простой фильтр для потока данных.Фильтр подачи данных многоадресной передачи C++

Я пишу приложение для обработки потоковых финансовых данных, например, цены акций всех акций, обращающихся на Нью-Йоркской фондовой бирже. Поток данных выглядит примерно так.

SJYM2 Quote: Bid=91.265000, 4 Ask=91.330000, 4 
6SM2 Quote: Bid=1.105500, 23 Ask=1.105800, 5 
RFM2 Quote: Bid=1.204500, 6 Ask=1.205000, 7 
6SM2 Quote: Bid=1.105500, 24 Ask=1.105800, 5 
6SM2 Quote: Bid=1.105500, 25 Ask=1.105800, 5 
6SM2 Quote: Bid=1.105500, 26 Ask=1.105800, 5 
6SM2 Quote: Bid=1.105500, 27 Ask=1.105800, 5 
6SM2 Quote: Bid=1.105500, 28 Ask=1.105800, 5 
GEH3-GEZ3 Quote: Bid=23.500000, 325 Ask=24.500000, 1501 
GE:BF_M2-H3-Z3 Quote: Bid=-15.500000, 936 Ask=-14.000000, 16 
GEM3-GEU3 Quote: Bid=7.500000, 21823 Ask=8.000000, 79 
GE:DF_H3H4H5H6 Quote: Bid=-21.000000, 6 Ask=-19.000000, 4 
NGG3-NGQ3 Quote: Bid=-0.162000, 2 Ask=-0.081000, 1 
NGH3-NGU3 Quote: Bid=-0.185000, 3 Ask=-0.102000, 1 
BZK2 Quote: Bid=123.970000, 1 Ask=124.120000, 1 
BZ:C1_HO-BZ_K2 Quote: Bid=11.100000, 1 Ask=11.320000, 1 
BZ:C1_RB-BZ_K2 Quote: Bid=17.060000, 1 Ask=17.310000, 1 
BZM2 Quote: Bid=123.250000, 1 Ask=123.460000, 1 
BZN2 Quote: Bid=122.530000, 1 Ask=122.920000, 1 
CLK2-BZK2 Quote: Bid=-18.770000, 1 Ask=-18.610000, 1 
BZK2 Quote: Bid=123.970000, 1 Ask=124.110000, 5 
BZ:C1_HO-BZ_K2 Quote: Bid=11.110000, 1 Ask=11.320000, 1 
BZ:C1_RB-BZ_K2 Quote: Bid=17.070000, 2 Ask=17.310000, 1 
BZM2 Quote: Bid=123.250000, 1 Ask=123.450000, 5 
BZN2 Quote: Bid=122.530000, 1 Ask=122.910000, 1 

Если я заинтересован только в BZN2, BZK2 и 6SM2 данные, что это лучший способ, чтобы создать простой фильтр, чтобы вытащить только те данные?

Спасибо.

ответ

1

Поскольку маркер всегда находится на первом месте в строке, вы можете разделить каждую входящую строку на пробел, взять первую подстроку и сравнить ее с набором шаблонов с использованием strcmp(). Здесь вы также можете использовать regexp, но это не нужно.

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

+0

Я думал об использовании strcmp(), но проблема в том, что мне может потребоваться извлечь данные для 20 разных запасов, поэтому для каждого нового сообщения мне, возможно, придется пройти через 20 strcmp(), есть ли более быстрый способ решите эту проблему? – 2607

+0

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

+0

Не могли бы вы привести пример замены strcmp || strcmp || strcmp || ... с помощью лексического анализатора? Я думал о том, чтобы ввести 20 символов в std :: map, а затем вызвать метод map.find(). Благодарю. – 2607

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