我经常遇到一个场景,我需要解析一个非常大的输入文件,然后处理最终输出的行。对于许多这些文件,处理可能需要一段时间。
由于它通常是相同的过程,并且通常我想将处理后的数据存储到哈希以进行最终操作,似乎Parallel::Loops
之类的内容可能会有所帮助并加快进程
如果我没有正确思考,请告诉我。
之前我曾使用Parallel::Loops
一次处理多个文件并取得了很好的效果,但我无法弄清楚如何处理来自一个文件的多行文件,因为我不知道知道如何传递文件的每一行作为参考。
如果我尝试这样做:
#!/usr/bin/perl
use warnings;
use strict;
use Data::Dumper;
use Parallel::Loops;
my $procs = 12;
my $pl = Parallel::Loops->new($procs);
my %data;
$pl->share(\%data);
my $input_file = shift;
open( my $in_fh, "<", $input_file ) || die "Can't open the file for reading: $!";
$pl->while( <$in_fh>, sub {
<some kind of munging and processing here>
});
我收到错误:
Can't use string ("6334") as a subroutine ref while "strict refs" in use at /usr/local/share/perl/5.14.2/Parallel/Loops.pm line 518, <$in_fh> line 501.
我知道我需要传递对并行对象的引用,但我无法弄清楚如何引用readline
元素。
我也知道我可以先打开整个文件,然后传递所有行的数组引用,但是对于需要大量内存的非常大的文件,直观上需要更多时间,因为它在技术上需要然后两次读取文件。
有没有办法将文件的每一行传递到Parallel::Loops
对象,以便我可以一次处理文件的许多行?
答案 0 :(得分:0)
由于我的笔记本电脑没有安装Parallel::Loops
且我没有一致的互联网访问权限,我无法对此进行测试。
但是,从the documentation开始,while
方法显然需要参数的两个子例程引用,并且您将<$in_fh>
作为第一个传递。该方法可能使用原型将其参数强制转换为标量,这意味着您传递的是一个简单的字符串,其中需要子例程引用。
由于我的情况,我很不确定,但你可能会得到
的结果$pl->while(
sub {
scalar <$in_fh>;
},
sub {
# Process a line of data
}
);
我希望这会有所帮助。我星期五回家后会进一步调查。