我正在编写一个脚本,它将数据库作为输入,并按照某些规则从10+表中生成所有有效组合。由于输出非常大,我通过gzip将其转储到文件中,如下所示:
open( my $OUT, '|-', "gzip > file" );
for ( @data ) {
my $line = calculate($_);
print $OUT $line;
}
由于野兽的性质,我最终不得不制作成千上万的小写,每行一个。这意味着在每次计算之间,它等待gzip接收数据并完成压缩。至少我是这么认为的,我可能错了。
如果我是对的,我想知道如何使这个打印异步,即它在gzip上触发数据,然后继续处理数据。
答案 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