目前,我有一个使用
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上运行.