Windows Perl内存不足
我有一个脚本,它读取两个csv文件,并对它们进行比较,以确定其中一个文件中出现的ID是否也出现在另一个文件中。我收到的错误如下: 在67112960字节的“大”请求期间内存不足,总sbrk()为348203008字节 现在是代码:Windows Perl内存不足,windows,perl,memory,Windows,Perl,Memory,我有一个脚本,它读取两个csv文件,并对它们进行比较,以确定其中一个文件中出现的ID是否也出现在另一个文件中。我收到的错误如下: 在67112960字节的“大”请求期间内存不足,总sbrk()为348203008字节 现在是代码: use strict; use File::Basename; my $DAT = $ARGV[0]; my $OPT = $ARGV[1]; my $beg_doc = $ARGV[2]; my $end_doc = $ARGV[3]; my
use strict;
use File::Basename;
my $DAT = $ARGV[0];
my $OPT = $ARGV[1];
my $beg_doc = $ARGV[2];
my $end_doc = $ARGV[3];
my $doc_counter = 0;
my $page_counter = 0;
my %opt_beg_docs;
my %beg_docs;
my ($fname, $dir, $suffix) = fileparse($DAT, qr/\.[^.]*/);
my $outfile = $dir . $fname . "._IMGLOG";
open(OPT, "<$OPT");
while(<OPT>){
my @OPT_Line = split(/,/, $_);
$beg_docs{@OPT_Line[0]} = "Y" if(@OPT_Line[3] eq "Y");
$opt_beg_docs{@OPT_Line[0]} = "Y";
}
close(OPT);
open(OUT, ">$outfile");
while((my $key, my $value) = each %opt_beg_docs){
print OUT "$key\n";
}
close(OUT);
open(DAT, "<$DAT");
readline(DAT); #skips header line
while(<DAT>){
$_ =~ s/\xFE//g;
my @DAT_Line = split(/\x14/, $_);
#gets the prefix and the range of the beg and end docs
(my $pre = @DAT_Line[$beg_doc]) =~ s/[0-9]//g;
(my $beg = @DAT_Line[$beg_doc]) =~ s/\D//g;
(my $end = @DAT_Line[$end_doc]) =~ s/\D//g;
#print OUT "BEGDOC: $beg ENDDOC: $end\n";
foreach($beg .. $end){
my $doc_id = $pre . $_;
if($opt_beg_docs{$doc_id} ne "Y"){
if($beg_docs{$doc_id} ne "Y"){
print OUT "$doc_id,DOCUMENT NOT FOUND IN OPT FILE\n";
$doc_counter++;
} else {
print OUT "$doc_id,PAGE NOT FOUND IN OPT FILE\n";
$page_counter++;
}
}
}
}
close(DAT);
close(OUT);
print "Found $page_counter missing pages and $doc_counter missing document(s)";
使用严格;
使用File::Basename;
my$DAT=$ARGV[0];
my$OPT=$ARGV[1];
my$beg_doc=$ARGV[2];
my$end_doc=$ARGV[3];
我的$doc\u计数器=0;
我的$page_计数器=0;
我的%opt_beg_文档;
我的%beg_文件;
my($fname,$dir,$suffix)=文件解析($DAT,qr/\.[^.]*/);
我的$outfile=$dir$fname。“_IMGLOG”;
开放式(可选,“$outfile”);
while((我的$key,我的$value)=每个%opt\u beg\u文档){
打印出“$key\n”;
}
收尾;
open(DAT),我不确定这是否是导致错误的原因,但在您正在读取DAT
的循环中,您可能希望替换以下内容:
(my $pre = @DAT_Line[$beg_doc]) =~ s/[0-9]//g;
为此:
(my $pre = $DAT_Line[$beg_doc]) =~ s/[0-9]//g;
其他两行也一样。您没有使用使用警告;
,您没有检查打开文件时的错误,也没有打印显示正在读取的行的调试语句
你知道输入文件是什么样子的吗?如果它没有换行符,你会一次读取整个文件,如果文件太大,那将是灾难性的。注意你是如何解析文件的。你正在关闭文件句柄,然后试图在DAT
循环中打印到它,我认为这是错误的您可能会输出到随机内存,因为您关闭了文件句柄-奇怪的是,它没有输出错误
移除第一个关闭(OUT);
并查看是否有改进
我仍然不知道你的问题是什么,如果是关于错误消息,这意味着你的内存不足。如果是关于消息本身,你试图消耗太多内存。如果这是你消耗太多内存的原因,我会首先问你是否阅读了上面的消息,然后问你的系统有多少内存,然后我会跟进h看看如果去掉正则表达式是否会有所改进。您应该始终启用警告(使用警告)在开发Perl代码时。@tadmc可以……让我看看会发生什么,然后使用散列而不是数组。但我不明白为什么内存不足。OPT文件中有多少条记录?能否给出OPT文件的一段代码,以便我们可以看到这些记录的样子?另外,您有两个散列都在@OPT_行[0]上键入(顺便说一句,它应该是$OPT_Line[0]),这可能是低效的;您最好将其放入一个哈希中。您应该使用间接/词法文件句柄(例如打开我的$foo…)而不是直接文件句柄。使用@而不是$访问数组元素将生成警告,否则应该可以。