2015-04-22 3 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' и' use warnings' в начало вашей программы и удалите амперсанд '&' из всех вызовов подпрограмм. – Borodin

+0

Что такое '$ pk_string'? И 'execsql'? – Borodin

ответ

1

Немного сложно рассказать по вашему примеру, поскольку вы используете глобальные переменные или просто используете их, не объявляя их; предыдущий комментарий об использовании strict; и т. д. является хорошим.

Моя мысль состоит в том, что переменная $ dbp (которая, как представляется, содержит все результаты, основанные на теле execsql), потребляет пространство после каждого вызова, и у вас недостаточно свободного места при поступлении второго вызова вокруг. Я предлагаю сделать dbp моей переменной в этой функции и очистить ее до выхода из функции.

+0

Попробуй это предложение и сообщите, если оно работает. – Meera

Смежные вопросы