perl中的标量变量有限制吗?

perl中的标量变量有限制吗?,perl,mmap,Perl,Mmap,现在我正在处理大于(1.5GB)的大文件。所以我使用了File::Map。当输入大于2.1 GB时脚本失败,在file.pl第16行显示错误在打印中使用未初始化值$count。 但脚本正在运行2.1GB及低于2.1GB 我的脚本如下 use warnings; use strict; use File::Map 'map_file'; my $filename ="/root/Desktop/test_sequence/human_genome"; map_file (my $map,$fil

现在我正在处理大于(1.5GB)的大文件。所以我使用了
File::Map
。当输入大于
2.1 GB时
脚本失败,在file.pl第16行显示错误
在打印中使用未初始化值$count。

但脚本正在运行
2.1GB及低于2.1GB

我的脚本如下

use warnings;
use strict;
use File::Map 'map_file';
my $filename ="/root/Desktop/test_sequence/human_genome";

map_file (my $map,$filename);

my $count;

$count++ while ($map=~/>/g);

print $count; #The file has only 14 `>` so result is 14.
同时,我在没有模块的情况下尝试了它。它也会以相同的错误终止

use warnings;
use strict;
my $filename ="/root/Desktop/test_sequence/human_genome";

open my $fh,"<",$filename or die "$!";

my $m = do{local $/; <$fh>};

my $count;

$count++ while ($m=~/>/g);

print $count;
使用警告;
严格使用;
my$filename=“/root/Desktop/test_sequence/human_genome”;

打开我的$fh,“问题确实是最大标量大小。理论上,在32位perl上它可以达到4 GB,但由于您的地址空间有限,无法容纳操作系统之类的东西,因此2-3.5 GB通常是真正的限制。使用64位操作系统和perl应该可以

了解一些细节

编辑:在Fedora上的perl 5.22.2,x86_64-linux-thread-multi中可以正常工作:

$ dd if=/dev/zero of=zero bs=1M count=5000
5000+0 records in
5000+0 records out
5242880000 bytes (5.2 GB) copied, 34.8694 s, 150 MB/s
$ perl -e 'sub wat{open my $fh, ">>zero" or die $!;
   seek($fh,shift,0); syswrite($fh, ">");}
   wat(1000);
   wat(100_000_000);
   wat(4_500_000_000);'
$ time perl map.pl 
3
real    0m5.638s
user    0m3.921s
sys     0m1.717s

问题确实是最大标量大小。理论上,32位perl上的最大标量大小可以达到4 GB,但由于您的地址空间有限,无法容纳操作系统之类的东西,因此2-3.5 GB通常是真正的限制。但使用64位操作系统和perl应该可以

了解一些细节

编辑:在Fedora上的perl 5.22.2,x86_64-linux-thread-multi中可以正常工作:

$ dd if=/dev/zero of=zero bs=1M count=5000
5000+0 records in
5000+0 records out
5242880000 bytes (5.2 GB) copied, 34.8694 s, 150 MB/s
$ perl -e 'sub wat{open my $fh, ">>zero" or die $!;
   seek($fh,shift,0); syswrite($fh, ">");}
   wat(1000);
   wat(100_000_000);
   wat(4_500_000_000);'
$ time perl map.pl 
3
real    0m5.638s
user    0m3.921s
sys     0m1.717s

您在以下几个位置之一达到了有符号32位整数限制

32位有符号值允许从
0x1000_0000
0x7FFF_FFFF
的值,即-2147483648到2147483647。因此您的限制为2.1GB

我不知道这是否是perl构建的一个限制,或者它是否是perl的一部分

任何大小的文件都可以非常简单地通过一次读取一行来处理,而且由于您在这里的目的似乎只是计算Unicode
大于符号的字符数,因此您可以像这样轻松地进行处理

use strict;
use warnings;

use constant HUMAN_GENOME => '/root/Desktop/test_sequence/human_genome';

my $count = do {

    open my $fh, '<', HUMAN_GENOME or die sprintf qq{Unable to open "%s": $!}, HUMAN_GENOME;

    my $n = 0;

    $n += tr/>// while <$fh>;

    $n;
};

print $count;
使用严格;
使用警告;
使用常量HUMAN_GENOME=>'/root/Desktop/test_sequence/HUMAN_GENOME';
我的$count=do{

打开我的$fh,“您在几个地方中的一个达到了有符号32位整数限制

32位有符号值允许从
0x1000_0000
0x7FFF_FFFF
的值,即-2147483648到2147483647。因此您的限制为2.1GB

我不知道这是否是perl构建的一个限制,或者它是否是perl的一部分

任何大小的文件都可以非常简单地通过一次读取一行来处理,而且由于您在这里的目的似乎只是计算Unicode
大于符号的字符数,因此您可以像这样轻松地进行处理

use strict;
use warnings;

use constant HUMAN_GENOME => '/root/Desktop/test_sequence/human_genome';

my $count = do {

    open my $fh, '<', HUMAN_GENOME or die sprintf qq{Unable to open "%s": $!}, HUMAN_GENOME;

    my $n = 0;

    $n += tr/>// while <$fh>;

    $n;
};

print $count;
使用严格;
使用警告;
使用常量HUMAN_GENOME=>'/root/Desktop/test_sequence/HUMAN_GENOME';
我的$count=do{


打开我的$fh,'我正在使用64位centOS 7,32 GB ram。好吧,
File::Map
?从我的理解来看,是什么创建了与文件的直接链接。那么为什么这也不能工作呢?
perl-v
说了什么?@Sobrique它显示了
这是为x86\u 64-linux-thread-multi构建的perl 5,版本16,subversion 3(v5.16.3)(有29个注册补丁,…
@mkHun:几行之后,它将有一个
use64bit
的值。它可能是
undef
。我正在使用64位centOS 7,32 GB ram。好的,
文件::Map
?根据我的理解,它创建了与文件的直接链接。那么为什么这也不能工作呢?
perl做了什么-v
say?@Sobrique它显示了
这是为x86_64-linux-thread-multi构建的perl 5,版本16,subversion 3(v5.16.3)(有29个注册补丁,…
@mkHun:再往下几行,它将有一个
use64bit
的值。它可能是
undef
。如果你所做的只是计算
-你真的需要将整个文件读入内存吗?@Sobrique我正试图在一个文件中找到重复的部分。所以我想计算文件的头数。)一个文件。然后我将继续。您确定在模式匹配(m//)中未使用
未初始化值$map
在模式匹配(m//)中未使用未初始化值$m吗
事先?@Borodin,你可能想阅读OP的代码。不,这不是我的问题,OP的代码在这里工作正常。我正在试图找出他设置中可能出现的其他问题。@Borodin,主题是“我不知道这里出了什么问题?”?".那么告诉我,这里允许什么样的调查方向?这不是OP的代码,也不是
文件::Map
。我已经验证过了。它在这里按预期工作。是吗?如果你所做的只是计算
-你真的需要将整个文件读入内存吗?@Sobrique我正在试图在文件中找到重复项。所以我nt来计算文件中的头数。然后我将继续。您确定在模式匹配(m/)中没有使用未初始化值$map
或在模式匹配(m/)中使用未初始化值$m吗
事先?@Borodin,您可能想阅读OP的代码。不,这不是我的问题,OP的代码在这里工作正常。我正在试图找出在他的设置中还有什么可能被破坏。@Borodin,主题是“我不知道这里出了什么问题?”.那么告诉我,这里允许什么样的调查方向?它既不是OP的代码,也不是
文件::Map
。我已经验证了它。它在这里按预期工作。是吗?这是我的想法,但从他的perl版本来看,听起来不太可能。而且
文件::Map
肯定可以处理>4 GB的数据,所以它确实有点神秘。当然,速度很慢工作版本比快速破坏的版本要好,但由于
File::Map
足够性感,可以继续尝试一点;)好的,我会咬一口“听起来不太可能”。为什么?Perl代码是什么影响了你的判断?“
File::Map
肯定可以处理>4GB”如果您有证据,请出示您的代码以便验证。OP:“我正在使用64位centOS 7”。我没有centOS 7到chec