如何从我的perl脚本非阻塞写入gzip文件?

时间:2010-12-28 10:37:21

标签: perl nonblocking

我正在编写一个脚本,它将数据库作为输入,并按照某些规则从10+表中生成所有有效组合。由于输出非常大,我通过gzip将其转储到文件中,如下所示:

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

由于野兽的性质,我最终不得不制作成千上万的小写,每行一个。这意味着在每次计算之间,它等待gzip接收数据并完成压缩。至少我是这么认为的,我可能错了。

如果我是对的,我想知道如何使这个打印异步,即它在gzip上触发数据,然后继续处理数据。

3 个答案:

答案 0 :(得分:4)

尝试IO::Compress::Gzip。它接受filehandle来写入。你可以在那个文件句柄上set O_NONBLOCK

答案 1 :(得分:2)

管道已经使用缓冲区,因此编写程序不必等待读取程序。但是,该缓冲区通常相当小(在Linux上通常只有64KB)并且不容易更改(它需要重新编译内核)。如果标准缓冲区不够,最简单的方法是在管道中包含一个缓冲程序:

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

bfr只是将STDIN读入内存缓冲区,并以下一个程序允许的速度写入STDOUT。默认值为5MB缓冲区,但您可以使用-b选项进行更改(例如,bfr -b10m用于10MB缓冲区)。

答案 2 :(得分:1)

我自然会按照您的意愿在线程或分叉中完成。 http://hell.jedicoder.net/?p=82