2013-11-24 29 views
0

我传递2个具有1000万行(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 GB后因内存不足而死亡,因为两个输入映射使用的内存都在600 MB左右,所以不应使用它。 – jayesh

+0

就我所见,这个子程序只使用常量内存。虽然可以改进,但很可能不是问题的根源。你确定*在执行这段代码时抛出了内存不足的异常吗?究竟在哪里发生? (Hunches:可能在打开文件时,更可能是'$ logger'正在做的事情) – amon

回答

0

我想出了根本原因。这是由于我正在使用Dumper功能在调用上述功能之前将日志文件中的地图内容转储。我删除了该行,现在不再发生内存不足错误。