使用Parallel :: Loops模块并行读取输入文件

时间:2014-03-19 20:49:26

标签: perl

我经常遇到一个场景,我需要解析一个非常大的输入文件,然后处理最终输出的行。对于许多这些文件,处理可能需要一段时间。

由于它通常是相同的过程,并且通常我想将处理后的数据存储到哈希以进行最终操作,似乎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对象,以便我可以一次处理文件的许多行?

1 个答案:

答案 0 :(得分:0)

由于我的笔记本电脑没有安装Parallel::Loops且我没有一致的互联网访问权限,我无法对此进行测试。

但是,从the documentation开始,while方法显然需要参数的两个子例程引用,并且您将<$in_fh>作为第一个传递。该方法可能使用原型将其参数强制转换为标量,这意味着您传递的是一个简单的字符串,其中需要子例程引用。

由于我的情况,我很不确定,但你可能会得到

的结果
$pl->while(
    sub {
      scalar <$in_fh>;
    },
    sub {
      # Process a line of data
    }
);

我希望这会有所帮助。我星期五回家后会进一步调查。