Информация об изменениях

Сообщение Многопоточно распарсить файл с fix сообщениями от 14.01.2022 14:27

Изменено 15.01.2022 9:04 avovana

Re: Многопоточно распарсить файл с fix сообщениями
Добрый день, дорогие форумчане!

Задача на многопоточность на парсинг файла.
На вход приходит файл под 1 Мб c сообщениями FIX формата
Прикрепляю фотку как это выглядит на облачном диске и как в реале, если открыть Notepad++.

В основном, сообщение это тег=значениеSOHтег=значениеSOH
SOH — это такой символ-разделитель.
В начале каждого сообщения 8=FIX.4.4.
Т.е. отдельное сообщение будет выглядеть:
8=FIX.4.4SOH9=75SOH35=0SOH49=MFIXTradeIDSOH56=MU0319300002SOH34=4949SOH52=20211215-20:10:16.250076549SOH10=244SOH

Нужно выдать на выходе подмножество сообщений:
1) Используя самописный пул поток распарсить файл
2) Давая возможность юзеру задать временной интервал. В сообщение есть метка времени в теге 52. Собственно, проверить, входит ли значение в интервал
3) Еще юзер может задать доп фильтрацию. Типа хочет сообщения еще у которых тег1=значение1 && тег2=значение1 ...
4) Пользоваться только С++ и std. Не пользоваться регулярками.

Пример вывода:
8=FIX.4.4|9=11|35=0|49=some1|12=mp2|52=20221016-10:12:15|10=2|
8=FIX.4.4|9=22|35=0|49=some2|12=mp2|52=20221016-10:13:16|10=2|
8=FIX.4.4|9=33|35=0|49=some3|12=mp2|52=20221016-10:14:46|10=2|

====================

Придумал такое решение:

а) Разделить исходный файл на куски == количеству ядер == количеству потоков
б) Каждому потоку отдать свой кусок и условие для фильтрации
в) Каждый поток:
-парсит свой кусок выделяя сообщения. Сохраняет очередное сообщение в map<сообщение, hash_map<тег, значение>>
-перебирает map проверяя условия — временная метка входит ли в интервал, теги имеют ли нужные значения
-добавляет отфильтрованные сообщения в результирующий вектор
-возвращает результирующий вектор
г) Основной поток main:
-дожидается результата=результирующих векторов от всех потоков.
-складывает все вектора в итоговый
-возвращает в stdout итоговый
Многопоточно распарсить файл с fix сообщениями
Добрый день, дорогие форумчане!

Задача на многопоточность на парсинг файла.
На вход приходит файл под 1 Мб c сообщениями FIX формата
Прикрепляю фотку как это выглядит на облачном диске и как в реале, если открыть Notepad++.

В основном, сообщение это тег=значениеSOHтег=значениеSOH
SOH — это такой символ-разделитель.
В начале каждого сообщения 8=FIX.4.4.
Т.е. отдельное сообщение будет выглядеть:
8=FIX.4.4SOH9=75SOH35=0SOH49=MFIXTradeIDSOH56=MU0319300002SOH34=4949SOH52=20211215-20:10:16.250076549SOH10=244SOH

Нужно выдать на выходе подмножество сообщений:
1) Используя самописный пул поток распарсить файл
2) Давая возможность юзеру задать временной интервал. В сообщение есть метка времени в теге 52. Собственно, проверить, входит ли значение в интервал
3) Еще юзер может задать доп фильтрацию. Типа хочет сообщения еще у которых тег1=значение1 && тег2=значение1 ...
4) Пользоваться только С++ и std. Не пользоваться регулярками.

Пример вывода:
8=FIX.4.4|9=11|35=0|49=some1|12=mp2|52=20221016-10:12:15|10=2|
8=FIX.4.4|9=22|35=0|49=some2|12=mp2|52=20221016-10:13:16|10=2|
8=FIX.4.4|9=33|35=0|49=some3|12=mp2|52=20221016-10:14:46|10=2|

====================

Придумал такое решение:

а) Разделить исходный файл на куски == количеству ядер == количеству потоков
б) Каждому потоку отдать свой кусок и условие для фильтрации
в) Каждый поток:
-парсит свой кусок выделяя сообщения. Сохраняет очередное сообщение в map<сообщение, hash_map<тег, значение>>
-перебирает map проверяя условия — временная метка входит ли в интервал, теги имеют ли нужные значения
-добавляет отфильтрованные сообщения в результирующий вектор
-возвращает результирующий вектор
г) Основной поток main:
-дожидается результата=результирующих векторов от всех потоков.
-складывает все вектора в итоговый
-возвращает в stdout итоговый