Как я могу сделать запись в файл gzip из моего неблокирующего сценария perl? - PullRequest
2 голосов
/ 28 декабря 2010

В настоящее время я пишу скрипт, который принимает базу данных в качестве входных данных и генерирует все допустимые комбинации из 10+ таблиц, следуя определенным правилам.Так как вывод чертовски огромен, я выкидываю это через gzip в файл, например:

open( my $OUT, '|-', "gzip > file" );
for ( @data ) {
    my $line = calculate($_);
    print $OUT $line;
}

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

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

Ответы [ 3 ]

4 голосов
/ 28 декабря 2010

Дайте IO::Compress::Gzip попробовать. Он принимает дескриптор файла для записи. Вы можете установить O_NONBLOCK для этого дескриптора файла.

2 голосов
/ 28 декабря 2010

Трубы уже используют буфер, так что пишущей программе не нужно ждать считывающей программы. Однако этот буфер обычно довольно мал (обычно он составляет всего 64 КБ в Linux), и его нелегко изменить (требуется перекомпиляция ядра). Если стандартного буфера недостаточно, проще всего включить в конвейер программу буферизации:

open( my $OUT, '|-', "bfr | gzip > file" );

bfr просто считывает STDIN в буфер в памяти и записывает в STDOUT так быстро, как позволяет следующая программа. По умолчанию используется буфер 5 МБ, но вы можете изменить его с помощью параметра -b (например, bfr -b10m для буфера 10 МБ).

1 голос
/ 28 декабря 2010

естественно я сделаю это в потоке или с вилкой, как вы хотите.http://hell.jedicoder.net/?p=82

...