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);
}
什么是内存消耗?我们在谈论什么数量? – user973254
我的脚本在使用3.5 GB后因内存不足而死亡,因为两个输入映射使用的内存都在600 MB左右,所以不应使用它。 – jayesh
就我所见,这个子程序只使用常量内存。虽然可以改进,但很可能不是问题的根源。你确定*在执行这段代码时抛出了内存不足的异常吗?究竟在哪里发生? (Hunches:可能在打开文件时,更可能是'$ logger'正在做的事情) – amon