perl – XML文件的并行处理

目前,我有一个使用
XML :: Twig并解析20个
XML文件的应用程序.每个文件达到0.5GB,处理按顺序进行:

foreach (@files) {  
    my $ti = XML::Twig->new( 
        keep_encoding => 1,
        twig_handlers => {
            'section' => sub { $_->purge(); }
        }
    )->parsefile($_);
}

有没有办法使用perl并行运行此代码,如果是,我该怎么办?我的应用程序在Windows系统上运行.

最佳答案 你应该使用
Parallel::ForkManager的CPAN.这个(有一点点
included explanation)应该允许你分叉每个进程并单独解析文件.另外,请注意Perl 5有
threads,但性能提升可能不会很大.

链接页面上提供的代码应该按照您的要求进行,但为了方便起见,我已在此处发布.正如您所看到的,它真正做的就是创建一个新的数据结构来管理最大数量的允许进程,并为每个新数据块(或文件)分叉并返回子进程,进行工作,然后终止进程:

use Parallel::ForkManager;

$pm = Parallel::ForkManager->new($MAX_PROCESSES);

foreach $data (@all_data) {
  # Forks and returns the pid for the child:
  my $pid = $pm->start and next;

  ... do some work with $data in the child process ...

  $pm->finish; # Terminates the child process
}

请注意,如果要在那里创建进程,可能需要在Windows上使用WINAPI(因为Parallel :: ForkManager我相信使用Windows内核级线程,但仍然应该充分执行任务). Perl还为您提供了使用Win32::API的CreateProcess()函数在Perl中进行多处理的选项(如果您导入它).还有用于多处理的Forks::Super软件包选项,它也可以在Windows上运行.

点赞