LINUX.ORG.RU

Увеличить число потоков обработки текста

 


0

1

Здравствуйте, коллеги. Подскажите. пожалуйста, мне нужно обрабатывать огромные массивы текстовой информации, и под это выделен отдельный сервер с 8 ядрами процессора.

При выполнении скрипта

cat rphost*/*.log | 
sed -r '/^p_[0-9]+: /d' |  
perl -pe 's/\xef\xbb\xbf//g; s/\n/@/g; s/\s/ /g; s/^[0-9]+:[0-9]+\.[0-9]+-[0-9]+,Context,.,Context=/,Context=/; s/#tt[0-9]+/#tt/g; s/^[0-9]+:[0-9]+.[0-9]+-.*Sql=/\n/; s/,Rows.*Context/Context/g; s/\?//g; s/.,Context=/|/g' |
perl -pe 's/\"//g' | perl -pe "s/\'//g" |
gawk -F'|' '{if ($2 !~ /^$/) {Req[$1]=$2}} END {for (i in Req) print Req[i]"|"i}'> Res.txt

Обнаружил, что так и не смог нормально утилизировать процессор, а процессов cat или perl не более четырех.

Работаю под виндой. Можно ли увеличить число потоков обработки или ускорить как-нибудь обработку? Единомоментно необходиом обрабатывать примерно 800Гб текста



Последнее исправление: beastie (всего исправлений: 1)

Работаю под виндой

форумом ошибся

anonymous
()
cat | sed | perl | perl | perl | gawk

зачем такая цепочка? один perl все сделает.

Это была попытка раскидать процессы по процессорам? Так у тебя пайп «последовательный» общая скорость будет как самая минимальная из цепочки.

пиши один скрипт на перле, разбивай исходный файл на части, обрабатывай параллельно, в конце сливай в один выходной файл

futurama ★★★★★
()

Работаю под виндой.

Для powershell версии 7:

get-help foreach-object

Для остальных версии:

Install-Module -Name PSParallel -Scope CurrentUser -Force

И вместо foreach-object используй invoke-parallel

anonymous
()
Ответ на: комментарий от anonymous

Да мне удобнее именно на баше. Так исторически сложилось

buganych
() автор топика
cat | пофиг_что > res.txt

И начало и конец цепочки последовательное чтение и запись. В любом случае упрешься в скорость последовательного чтения и записи. Какая, говоришь, скорость последовательного чтения и записи на устройство? При этом, если последовательно читается и пишется на одно и то же устройство, то получишь тормоза от непоследовательности.

В общем, смирись, у тебя изначально все однопоточно.

anonymous
()

Это дерьмо нужно переписать по-нормальному, а не «увеличить число потоков обработки».

anonymous
()

Очевидно тебе нужна модель map reduce. Hadoop, если ленивый. Если не ленивый можно на Rust написать.

slaykovsky ★★★
()

Тут одно время постоянно постили новости о gnu parallel, может оно поможет в данном смысле.

Однако если все в итоге упрется в ввод-вывод, использование большего числа ядер вряд-ли сильно поможет

yoghurt ★★★★★
()

GNU Parallel

anonymous
()

Разбить (брать) исходные логи по одному и обрабатывать Затем всё объединить

x905 ★★★★★
()
Ответ на: комментарий от yoghurt

Может в перле можно больше одного потока запустить, я не знаю. Но напрашивается пул воркеров которые парсят логи и отдельные потоки на чтение/запись. Проще такое делать на С++.

Liz812
()

обрабатывать огромные массивы текстовой информации

Господи, это смешные объёмы и смешная обработка - с таким справится любой raspberry pi в один поток, причём узким местом будет чтение с диска.

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

Во-вторых, когда он будет один, он тривиально распараллеливается хоть через xargs.

В-третьих, если ты хочешь «ускорить как-нибудь обработку», возьми любой нормальный компилируемый язык. Этот код настолько прост что под него можно за день выучить необходимый объём любого языка с нуля.

В-четвёртых, всегда храни тексты сжатыми (lz4, например), чтобы IO действительно не было узким местом.

slovazap ★★★★★
()
Ответ на: комментарий от no-such-file

Что конечно нет? Регулярка это конечный автомат и если она полностью определена на фазе компиляции ее преобразуют в код на С.

Liz812
()
Ответ на: комментарий от Liz812

Скорость хождения по if’ам между perl и C++ не велика. Оптимизируют именно работу с памятью, либо выпилывают бэктрекинг.

xpahos ★★★★★
()
Ответ на: комментарий от Liz812

Может в перле можно больше одного потока запустить

Можно. И не как в python.

insw
()
Ответ на: комментарий от Liz812

Проще такое делать на С++

Огромное заблуждение

yoghurt ★★★★★
()

Болезный, хотя бы cat из своего конвеера выкинь, sed сам в состоянии файл открыть. Три perl’а с регулярками и gawk в один объедини, а то что ты как этот. Да без sed можно обойтись, собственно, вообще все твои извращения можно свести к sed/awk/perl-скрипту (нужное подчеркнуть).

Возьми тот же parallel, каждый файл скармливай новой инстанции awk, и будет тебе счастье, особенно если диск умеет в parallel read.

Siborgium ★★★★★
()
Последнее исправление: Siborgium (всего исправлений: 1)

gnu/parallel, настало твоё время?

pon4ik ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.