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行。从主程序调用两次相同的子程序。它第一次通过罚款,第二次因内存不足而失败
答案 0 :(得分:1)
从你的例子中说出来有点困难,因为你要么使用全局变量,要么只使用它们而不声明它们;关于use strict的先前评论;是一个很好的。
我的想法是$ dbp变量(似乎包含所有结果,基于execsql的主体)在每次调用后消耗空间,并且当第二次调用到来时你没有足够的可用空间。我建议在此函数中将dbp作为我的变量,并在退出函数之前将其清除。