Замена 3 или больше цифр с эквивалентным количеством *

Таким образом, я перешел к источнику, и похоже, что замедление находится в обработке двухбайтовых символов. По существу, для каждого символьного чтения в, это должно звонить mbrtowc() чтобы попытаться преобразовать его в широкий символ, затем тот широкий символ тестируется, чтобы видеть, является ли это разделитель слов, разделитель строки, и т.д.

Действительно, если я изменяю свою локаль LANG переменная от значения по умолчанию en_US.UTF-8 (UTF-8 является многобайтовым набором символов), и установите его на"C"(простой однобайтовый набор символов), wc может использовать однобайтовую оптимизацию, который значительно ускоряет его, беря только приблизительно четверть настолько же долго как прежде.

Кроме того, это только должно проверить каждый символ, если это делает слово (-w), длина строки (-L) или символ (-m) количества. Если это только делает байт и/или количества строки, это может пропустить обработку широкого символа, и затем это работает чрезвычайно быстро - быстрее, чем md5sum.

Я прокрутил его gprof, и функции, которые используются для обработки многобайтовых символов (mymbsinit(), mymbrtowc(), myiswprint(), и т.д.), поднимают приблизительно 30% одного только времени выполнения, и код, который ступает через буфер, намного более сложен, потому что он должен обработать измеренные шаги переменной через буфер для измеренных символов переменной, а также наполняющий любые частично завершенные символы, которые охватывают буфер назад к началу буфера, таким образом, он может быть обработан в следующий раз вокруг.

Теперь, когда я знаю, что искать, я нашел несколько сообщений, упомянув utf-8 замедление с некоторыми утилитами:

https://stackoverflow.com/questions/13913014/grepping-a-huge-file-80gb-any-way-to-speed-it-up http://dtrace.org/blogs/brendan/2011/12/08/2000x-performance-win/

3
09.03.2019, 15:24
2 ответа
[1129178]Можно использовать [1129505]perl[1129506]:

/e[1129508] флаг заставляет [1129509]perl[1129510] вычислить правую сторону как выражение перед заменой.[1129181]

3
27.01.2020, 21:23
[1130164]GNU awk

Или если вы хотите посмотреть на Python

0
27.01.2020, 21:23

Теги

Похожие вопросы