2013-11-24 2 views
0

Я передаю 2 карты с 10 миллионами строк (1 строка имеет макс. 200 символов) до функции ниже. Эта функция вызывает ошибку памяти. Я новичок в perl, может кто-нибудь помочь мне выяснить, где я вызываю утечку памяти.Где моя программа perl утечка памяти?

sub createDataFile{ 
my($rowIdToBatchIdMap_ref, $batchIdToNFSFileNameMap_ref, $reportDataCsvFileName, $reportDataCsvFileNameToCreate) = @_; 

open FILETOREAD, $reportDataCsvFileName or die "unable to open a file $reportDataCsvFileName for reading reports data. $!"; 
open FILETOWRITE, ">".$reportDataCsvFileNameToCreate or die "unable to open a file $reportDataCsvFileNameToCreate for writing reports data. $!"; 

my $countOfReportHavingNullBatchId = 0; 
my $countOfMissingBatchIdInBatchTable = 0; 
my $countOfMissingTransRefNoInReportTable = 0; 

#reading file line by line 
while(<FILETOREAD>){ 

    my @fields = split(',', $_); 
    my $reportRowId = $fields[0]; 

    if(! exists($rowIdToBatchIdMap_ref->{$reportRowId})){ 
     $logger->log(Debug => "key do not exist in rowIdToBatchIdMap for row id $reportRowId"); 
     my $replacedLine = $fields[0]. ",," . $fields[1]; 
     print FILETOWRITE $replacedLine; 
     $countOfReportHavingNullBatchId++; 
     next; 
    } else { 
     my $batchId = $rowIdToBatchIdMap_ref->{$reportRowId}; 
     $batchId = trim($batchId); 

     if(! exists($batchIdToNFSFileNameMap_ref->{$batchId})){ 
      $logger->log(Debug => "key do not exist in batchIdToNFSFileNameMap_ref for batch id $batchId"); 
      my $replacedLine = $fields[0]. ",," . $fields[1]; 
      print FILETOWRITE $replacedLine; 
      $countOfMissingBatchIdInBatchTable++; 
     } else { 

      my $xmlFileName = $batchIdToNFSFileNameMap_ref->{$batchId}; 
      my $replacedLine = $fields[0]. "," . $xmlFileName . "," . $fields[1]; 
      print FILETOWRITE $replacedLine;  
     } 

    } 

} #end of while 

$logger->log(Info => "No of reports having null batch id in REPORT_DATA table is $countOfReportHavingNullBatchId"); 
$logger->log(Info => "No of reports whose batch id is not present in BATCH table is $countOfMissingBatchIdInBatchTable"); 
close(FILETOREAD); 
close(FILETOWRITE); 
} 
+0

какой объем памяти потребление? о какой сумме мы говорим? – user973254

+0

Мой скрипт умирает с ошибкой памяти после использования 3,5 ГБ, которую он не должен использовать, поскольку память, используемая для обеих входных карт, составляет около 600 МБ. – jayesh

+0

Насколько я вижу, эта подпрограмма использует только постоянную память. Хотя это может быть улучшено, скорее всего это не источник ваших проблем. Вы уверены, что во время выполнения этого кода возникает исключение из памяти? Где именно это происходит? (Hunches: Может быть, при открытии файлов, скорее всего, что-то делает '$ logger') – amon

ответ

0

Я понял причину. Это было связано с функцией Dumper, которую я использовал, чтобы сбрасывать содержимое карты в файл журнала перед вызовом указанной функции. Я удалил эту строку и теперь больше не получаю ошибку из памяти.

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