内存不足!在Perl程序中

时间:2015-04-22 16:49:10

标签: perl out-of-memory

sub fetch_ms_table {

  $ms_initial_cnt = 0;
  $logger->info("begin fetching TACCTTREE_MS");

  $SQL = "select $pk_string,LINK_C,LENGTH_Q,PATHS_Q from TACCTTREE_MS tree1 where OUT_Z>\"$process_time\"";

  &execsql($dbp, $SQL);
  $cnt  = 0;
  $cnt1 = 0;

  #load the MILESTONE table data
  while (@data = $dbp->dbnextrow()) {
    $data[0] =~ s/\s+//g;
    $taccttree_ms_cache{ $data[0] }{status}   = "d";    #default the record as deleted.
    $taccttree_ms_cache{ $data[0] }{pk}       = $data[0];
    $taccttree_ms_cache{ $data[0] }{LINK_C}   = $data[1];
    $taccttree_ms_cache{ $data[0] }{LENGTH_Q} = $data[2];
    $taccttree_ms_cache{ $data[0] }{PATHS_Q}  = $data[3];
    $ms_initial_cnt++;
  }

  $logger->info("end fetching taccttree_MS - fetched $ms_initial_cnt rows");
}

以上功能无法提供以下日志

INFO> main::fetch_ms_table begin fetching TACCTTREE_MS 
Failed for 'Milestone TACCTTREE table'

Std Err 
Out of memory! 

SQL返回大约5,050,402行。从主程序调用两次相同的子程序。它第一次通过罚款,第二次因内存不足而失败

1 个答案:

答案 0 :(得分:1)

从你的例子中说出来有点困难,因为你要么使用全局变量,要么只使用它们而不声明它们;关于use strict的先前评论;是一个很好的。

我的想法是$ dbp变量(似乎包含所有结果,基于execsql的主体)在每次调用后消耗空间,并且当第二次调用到来时你没有足够的可用空间。我建议在此函数中将dbp作为我的变量,并在退出函数之前将其清除。