您的位置:首页 > 其它

[Perl] 绕过内存不足的问题的一种方案

2011-07-04 11:02 204 查看
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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: