Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows Perl内存不足_Windows_Perl_Memory - Fatal编程技术网

Windows Perl内存不足

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

我有一个脚本,它读取两个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 $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…)而不是直接文件句柄。使用@而不是$访问数组元素将生成警告,否则应该可以。