Как я могу ускорить обработку Perl данных фиксированной ширины?

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

я начал использовать его пара несколько лет назад, и недавно я читал книга , которая принесла мне совершенно новую партию идей, и я начал работать над ним снова.

5
задан brian d foy 20 October 2009 в 07:19
поделиться

6 ответов

Да. Извлечение с помощью substr , вероятно, будет самым быстрым способом сделать это. То есть:

$FIELDS::transaction_date = substr $_, 0, 8;
$FIELDS::customer_id      = substr $_, 8, 20;

скорее всего будет быстрее. Если бы я писал этот код от руки, я бы не отказался от unpack , но если вы генерируете код, вы могли бы также попробовать и измерить.

См. Также ответы на Perl unpack () когда-либо быстрее, чем substr ()?

Что касается удаления начальных пробелов, s / ^ \ s + // , вероятно, будет самый быстрый метод.

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

my  $x  = substr $_, 0, 8;

для полей, которые не нуждаются в обрезке, и

my ($y) = substr($_, 8, 20) =~ /\A\s+(.+?)\s+\z/;

, которые нужно обрезать?

1
ответ дан 18 December 2019 в 14:48
поделиться

Я действительно сталкивался с этой проблемой снова и снова. Распаковать лучше, чем substr .

Что касается пространства для раздевалки, вы в значительной степени облажались. Этот хак с регулярным выражением - «официальный» способ сделать это. Возможно, вам удастся повысить эффективность, улучшив операторы распаковки (если длина данных не превышает 4 цифр, зачем распаковывать полные 12 цифр поля?), Но в остальном синтаксический анализ - это просто лаваш.

Удачи с ваши плоские данные. Чертовски устаревший хлам, как я его ненавижу.

7
ответ дан 18 December 2019 в 14:48
поделиться

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

Если вы действительно ограничены процессором, описанная проблема кажется в значительной степени распараллеливаемой, но, конечно, дьявол кроется в деталях ваших бизнес-вычислений .

3
ответ дан 18 December 2019 в 14:48
поделиться

Simply make it go in parallel. It's trivial, and on any even remotely modern machine it will be faster.

1
ответ дан 18 December 2019 в 14:48
поделиться

Тестирование версии нашего кода на основе substr показало, что она может быть примерно на 50% быстрее, чем наша существующая распаковка. Сравнивая коды в реальном приложении, версия substr дала нам сокращение времени выполнения на 16%. Это близко к тому, на что мы надеялись, основываясь на тесте и профилировании, упомянутом в вопросе.

Эта оптимизация может быть полезна для нас. Но у нас на горизонте миграция на новую ОС, поэтому мы подождем и посмотрим, как там работают коды, прежде чем продолжить. Мы добавили тест, чтобы следить за сравнительными тестами.

Идиома, которая у нас сейчас есть:

$FIELDS::transaction_date = substr( $_, 0, 8 ) || '';
$FIELDS::transaction_date =~ s/\s+\z//;
$FIELDS::customer_id = substr( $_, 8, 20 ) || '';
$FIELDS::customer_id =~ s/\s+\z//;

Далее следует выборочное удаление ведущего пробела, как и раньше.

Спасибо за все ответы. Я приму предложение Синан, потому что оно сработало для нас, несмотря на то, что казалось «просто неправильным».

0
ответ дан 18 December 2019 в 14:48
поделиться

Это тоже может быть что-то для XS - так что вы используете функцию C для изменения данные. Процесс сборки станет более сложным, так как вы зависим от компилятора C и потребуете дополнительных шагов интеграции.

1
ответ дан 18 December 2019 в 14:48
поделиться
Другие вопросы по тегам:

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