繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM