Perl файл обработки ограничен в размерах? - PullRequest
0 голосов
/ 12 апреля 2011

Я сделал переводчик в perl для переноса доски объявлений. Все, что я делаю, это применяю регулярные выражения и печатаю результат. Я пишу stdout в файл, и здесь мы идем! Но проблема в том, что моя программа не будет работать после написания 18 МБ!

Я сделал translate.pl (https://gist.github.com/914450) и запустите его с этой строкой: $ perl translate.pl mydump.sql> mydump-bbcode.sql

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

[EDIT] Я переработал код и очистил некоторые регулярные выражения (см. Gist.github.com/914450), но я все еще застрял. Когда я разделил большой дамп в 15М файлах, я запустил translate.pl 7 (процессы) на 7, чтобы использовать все ядра, но сценарий остановился с переменным размером. команда "tail" не показывает сложное сообщение ни по одному URL, когда останавливается ...

Спасибо, ребята! Я дам вам знать, если мне удастся наконец

Ответы [ 5 ]

1 голос
/ 12 апреля 2011

Вы говорите "сценарий останавливается". Он продолжает работать, но не производит больше вывода? Или на самом деле перестает работать? Если он перестает работать, что делает:

perl translate.pl mydump.sql > mydump-bbcode.sql
echo $?

показать? И если вы добавите print STDERR "done!\n"; после цикла, это отобразится?

1 голос
/ 12 апреля 2011

yikes - начните с основ:

use strict;
use warnings;

.. вверху вашего скрипта. Он будет жаловаться на то, что вы не правильно объявляете ваши лексические выражения, поэтому продолжайте и сделайте это. Я не вижу ничего очевидного, что усекло бы ваш файл, но, возможно, один или несколько ваших регулярных выражений являются патологическими. Кроме того, undef в конце не нужны.

Для того, что вы делаете, вы можете использовать sed

0 голосов
/ 14 апреля 2011

Привет, ребята, и большое спасибо за вашу помощь и идеи!Попытавшись сократить и распараллелить задания, я попытался разрезать свою программу на 3 программы: translate1.pl, translate2.pl и 3 ... задание выполнено, и оно быстро выполняется с помощью 8 активных ядер!

Затем мой launcher.sh запускает последовательно 3 сценария для каждого разделенного файла.сделано с 2 циклами и здесь мы идем:)

С уважением, Йоанн

0 голосов
/ 12 апреля 2011

Может происходить любое количество вещей:

  1. Попробуйте добавить $| = 1; в начало вашего скрипта.Это сделает весь вывод небуферизованным.
  2. Один из ваших регулярных выражений сходит с ума и удаляет строки, когда вы этого не ожидаете.
  3. Вы исчерпали место на диске.

Нет ничего действительно плохого в вашем скрипте (кроме того, что вы пропустили use strict; use warnings;, и вы не используете форму с тремя аргументами open()), которая заставила бы его перестать работать после некоторого магического числабайтов.

0 голосов
/ 12 апреля 2011

Perl, безусловно, может обрабатывать файлы, размер которых намного превышает 18 МБ. Я знаю, потому что я обычно запускаю файлы 5 ГБ через Perl.

Я думаю, что ваша проблема в while($html=<FILE>).

Всякий раз, когда $html устанавливается на пустую строку, while будет оцениваться как False и выходить из цикла.

Вам нужно использовать что-то вроде while( defined( $html = <FILE> ) )

Edit:

Хм. Я всегда думал, что вам нужен defined, но в моем тестировании только сейчас он не выходил на пустых строках или 0. Должно быть, это больше той особой магии Perl, которая в основном работает так, как вы намеревались - за исключением случаев, когда это не так. .

Действительно, если вы достаточно реструктурируете цикл while, вы можете заставить Perl работать так, как я всегда думал. (И это может иметь место в Perl 4 или в более ранних версиях Perl 5)

Это не удастся:

$x = <>;
chomp $x;
while( $x ) {
    print $x;
    $x = <>;
    chomp $x;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...