[英]How can i make writes to a gzip file from my perl script non-blocking?
我目前正在编写一个脚本,该脚本将数据库作为输入并按照某些规则从10多个表中生成所有有效组合。 由于输出相当大,因此我将其通过gzip转储到文件中,如下所示:
open( my $OUT, '|-', "gzip > file" );
for ( @data ) {
my $line = calculate($_);
print $OUT $line;
}
由于野兽的本质,尽管我最终不得不做成千上万的小写,每一行写一次。 这意味着在每次计算之间,它会等待gzip接收数据并完成压缩。 至少我是这样认为的,我可能是错的。
如果我是对的,我想知道如何使此打印异步,即它以gzip触发数据,然后继续处理数据。
尝试IO::Compress::Gzip
。 它接受要写入的文件句柄 。 您可以在该文件句柄上设置O_NONBLOCK
。
管道已经使用了缓冲区,因此写入程序不必等待读取程序。 但是,该缓冲区通常很小(在Linux上通常只有64KB),并且不容易更改(需要重新编译内核)。 如果标准缓冲区不足,那么最简单的方法就是在管道中包含一个缓冲程序:
open( my $OUT, '|-', "bfr | gzip > file" );
bfr只是将STDIN读入内存缓冲区,并在下一个程序允许的速度下将其写入STDOUT。 缺省值为5MB缓冲区,但是您可以使用-b
选项进行更改(例如,对于10MB缓冲区,为bfr -b10m
)。
当然,我会根据需要在线程中或用叉子进行操作。 http://hell.jedicoder.net/?p=82
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.