Size: a a a

BY Microsoft .NET User Group

2019 September 30

A

Artyom in BY Microsoft .NET User Group
В первую очередь при чтении/записи нужно проверять чтение/запись.
Что в деталях скрывается за "streamReader.ReadLine()" я не знаю, но я бы полез узнать. Вряд ли, конечно, он обращается к файлу построчно, но всё равно это первое что я бы копал. Возможно читал более крупными чанками (это банально зависит от ssd/nvme ssd/hdd).
Если говорить про CPU оптимизации, их нужно максимально изолировать от остального окружения. Банально выключить видео в youtube)) Ну и конечно прогонять тесты на уже загруженных данных. Тогда будет понятно, что меряем и что нужно оптимизировать. А вот дальше уже начинается самое интересное) Но все cpu-side оптимизации могут про сильно пролететь по сравнению с одной оптимизацией чтения.
Будет время может помогу с более дельными советами.
источник

ST

Sergey Tihon in BY Microsoft .NET User Group
EgorBo
ну самое простое решение - распараллелить на потоки (Parallels).
решать такую задачку через Avx/sse векторы еще лучше, но очень сложно парсить флоты.
такое вроде уже все сделано,  паралельный парсинг черех  TPL.Dataflow и парсинг float через обычное API и Span.

авх/ссе правда не решился еще пробовать.
паралелизация парсинга ускорила с 44 сек до 16 сек.
интересно можно ли дальше)
источник

E

EgorBo in BY Microsoft .NET User Group
cpu side нужен в любом случае если ты хочешь извлечь максимум (по сути на парсинг строки ты будешь раз в ~5 меньше времени тратить).  Читать построчтно - не надо
источник

ST

Sergey Tihon in BY Microsoft .NET User Group
EgorBo
cpu side нужен в любом случае если ты хочешь извлечь максимум (по сути на парсинг строки ты будешь раз в ~5 меньше времени тратить).  Читать построчтно - не надо
предлагаешь все прочитать в начале и засунуть в один string?
источник

E

EgorBo in BY Microsoft .NET User Group
Sergey Tihon
предлагаешь все прочитать в начале и засунуть в один string?
ну чанками же, в каждом по много строк для параллельной обработки, размер чанка будет сложно настроить :)
источник

AT

Alexey Tkachenko in BY Microsoft .NET User Group
буфер, упреждающее чтение, конечный автомат
источник

E

EgorBo in BY Microsoft .NET User Group
если сразу все прочитать - цпу будет без дела сидеть пока ио работает
источник

E

EgorBo in BY Microsoft .NET User Group
если по одной строке - то еще хуже
источник

AT

Alexey Tkachenko in BY Microsoft .NET User Group
если IO будет медленее парсинга, то лучше чем скорость IO сделать не получится в любом случае, а вот изгадить - легко
источник

E

EgorBo in BY Microsoft .NET User Group
если решишься все таки на симдах делать - могу помочь как-нибудь)
источник

ST

Sergey Tihon in BY Microsoft .NET User Group
ok =) спасибо.
не читать построчно - звучит как идея которую стоит попробовать =)
источник

RY

Ruslan Yakauleu in BY Microsoft .NET User Group
Видел как-то костыль в котором кусками вычитывали XML тоже из рассчёта "мы сейчас побольше прочитаем и будет ок". В итоге оно работало довольно тормозно и были проблемы с разбором самого файла и с тем, что над ним потом можно было сверху делать (т.к. само приведение в XmlElement уже довольно дорого стоит, а когда его ещё и над каждым кусочком делают...). Самым производительным вариантом в итоге стало выкинуть эту чудо-оптимизацию =)
источник

E

EgorBo in BY Microsoft .NET User Group
Ruslan Yakauleu
Видел как-то костыль в котором кусками вычитывали XML тоже из рассчёта "мы сейчас побольше прочитаем и будет ок". В итоге оно работало довольно тормозно и были проблемы с разбором самого файла и с тем, что над ним потом можно было сверху делать (т.к. само приведение в XmlElement уже довольно дорого стоит, а когда его ещё и над каждым кусочком делают...). Самым производительным вариантом в итоге стало выкинуть эту чудо-оптимизацию =)
хмл и жсон парсинг очень плохо параллелятся :)
источник

VK

Vladislav Khapin in BY Microsoft .NET User Group
Valentin Kononov
What about emitmapper?
Gpl и не поддерживается
источник

RY

Ruslan Yakauleu in BY Microsoft .NET User Group
EgorBo
хмл и жсон парсинг очень плохо параллелятся :)
Да там и параллелить не надо было. Надо было просто читать достаточно большие файлы не убивая при этом весь хост одним действием.
источник

E

EgorBo in BY Microsoft .NET User Group
Ruslan Yakauleu
Да там и параллелить не надо было. Надо было просто читать достаточно большие файлы не убивая при этом весь хост одним действием.
не всегда это возможно, иногда файлы слишком большие, иногда они буферно из сокета вылазят
источник

Dv

Dr. Friedrich von Never in BY Microsoft .NET User Group
Sergey Tihon
предлагаешь все прочитать в начале и засунуть в один string?
mmap лучше всего, имхо
источник

Dv

Dr. Friedrich von Never in BY Microsoft .NET User Group
Смапил файл в память — и дальше броди по нему как по спану
источник

AT

Alexey Tkachenko in BY Microsoft .NET User Group
Dr. Friedrich von Never
mmap лучше всего, имхо
+
источник

AT

Alexey Tkachenko in BY Microsoft .NET User Group
Dr. Friedrich von Never
Смапил файл в память — и дальше броди по нему как по спану
Хьюстон, у нас проблема: размер и индекс в спане 32-битный
источник