|
Perl的自动内存回收机制似乎不是很完善,有时程序会出现内存一直上涨最终内存不足的问题,到处undef也没能解决问题。一个绕过该问题的方法是,把整个任务拆分成子任务,每个任务跑一个进程。跑完一个进程再跑下一个进程,虽然没有从本质上解决问题,但可以使任务完成。下面是一个拆分文本处理过程的例子:
open(INPUT, $input_file) or die;
my @buf = <INPUT>;
close(INPUT);
open(OUTPUT, ">$output_file") or die;
my $sub_line_num = 100; # 每个进程处理的行数
my $all_line_num = @buf; # 总行数
my $fork_num = int($all_line_num/$sub_line_num); # 进程个数
for (my $i=0; $i<$fork_num; $i++) {
my @sub_buf;
if ($i<$fork_num-1) {
@sub_buf = @buf[$i*$sub_line_num .. ($i+1)*$sub_line_num-1];
}
else {
@sub_buf = @buf[$i*$sub_line_num .. $all_line_num-1];
}
my $pid = fork();
if ($pid != 0) {
print "New process started, pid = $pid\n";
waitpid($pid, 0); # 等待子进程退出
print "Process $pid exited normally\n";
}
# 此次开始子进程的操作
else {
foreach (@sub_buf) {
process_your_line($_); # 处理该行
}
exit;
}
}
close(OUTPUT); |
|
|