renshanshan 发表于 2015-12-28 07:42:58

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

  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);
页: [1]
查看完整版本: [Perl] 绕过内存不足的问题的一种方案