2015-04-22 54 views
0
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"); 
} 

上述功能失敗給下面的日誌,內存不足!在Perl程序

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

Std Err 
Out of memory! 

的SQL返回周圍5050402行。主程序調用兩次相同的子程序。第一次它通過罰款和第二次失敗的內存不足

+0

你的系統有多少內存?如果你對記憶非常緊張,你將不得不以批量方式獲取結果。 – tadman

+3

您正在使用大約二十年前的Perl 4標準。請在程序的頂部添加'use strict'和'使用warnings',並從所有子程序調用中刪除和號'&'。 – Borodin

+0

'$ pk_string'是什麼?和'execsql'? – Borodin

回答

1

這是有點難以告訴你的例子,因爲你要麼使用全局變量,要麼只是使用它們而沒有聲明它們;以前有關嚴格使用的評論;等等是一個很好的。

我的想法是,$ dbp變量(它似乎包含所有基於execsql主體的結果)在每次調用後都佔用空間,而當第二次調用時沒有足夠的可用空間周圍。我建議把dbp作爲這個函數中的一個變量,並在退出函數之前將其清除。

+0

將嘗試此建議,並讓你知道它是否工作。 – Meera