Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.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
在perl中将文件保存在内存中,同时像文件句柄一样使用它们_Perl_File_Io - Fatal编程技术网

在perl中将文件保存在内存中,同时像文件句柄一样使用它们

在perl中将文件保存在内存中,同时像文件句柄一样使用它们,perl,file,io,Perl,File,Io,我有一个perl脚本需要修改。脚本打开、读取和查找两个大(ASCII)文件(大小为几GB)。由于它做了很多,我想把这两个文件完全放入RAM中。在不经常修改脚本的情况下,最简单的方法是将文件加载到内存中,这样我就可以将生成的变量当作文件句柄来处理——例如,使用seek来获取特定的字节位置。这在perl中可能吗 更新:按照建议使用File::Slurp只对小文件执行此操作。如果文件大于2GB,则无法正常工作 最小示例: #!/usr/bin/env perl use strict; use warn

我有一个perl脚本需要修改。脚本打开、读取和查找两个大(ASCII)文件(大小为几GB)。由于它做了很多,我想把这两个文件完全放入RAM中。在不经常修改脚本的情况下,最简单的方法是将文件加载到内存中,这样我就可以将生成的变量当作文件句柄来处理——例如,使用seek来获取特定的字节位置。这在perl中可能吗

更新:按照建议使用File::Slurp只对小文件执行此操作。如果文件大于2GB,则无法正常工作

最小示例:

#!/usr/bin/env perl
use strict;
use warnings;
use Tie::File;
use File::Slurp 'read_file';

my $fn="testfile";

#buffer, then open as file, read first line:
read_file($fn, buf_ref => \my $file_contents_forests) or die "Could not read file!";
my $filehandle;
open($filehandle, "<", \$file_contents_forests) or die "Could not open buffer: $!\n";
my $line = "the first line:".<$filehandle>;
print $line."\n";
close($filehandle);

#open as file, read first line:
open( FORESTS,  "<",$fn) or die "Could not open file.\n";
my $line = "the first line:".<FORESTS>;
print $line;
close(FORESTS);
#/usr/bin/env perl
严格使用;
使用警告;
使用Tie::文件;
使用文件::Slurp'read_File';
my$fn=“testfile”;
#缓冲区,然后作为文件打开,读取第一行:
读取文件($fn,buf\u ref=>\my$file\u contents\u forests)或死亡“无法读取文件!”;
我的$filehandle;
打开($filehandle),在文件中读取:

use File::Slurp 'read_file';
read_file( "filename", buf_ref => \my $file_contents );
并打开它的文件句柄:

open my $file_handle, '<', \$file_contents;
打开我的$file\u句柄,读入文件:

use File::Slurp 'read_file';
read_file( "filename", buf_ref => \my $file_contents );
并打开它的文件句柄:

open my $file_handle, '<', \$file_contents;

打开我的$file\u句柄,'是的,这是可能的。很好!这是怎么可能的?检查您可以使用
Number::Bytes::Human::size
Devel::size::size
:在我的笔记本电脑上,我可以达到大约4GB…例如:
print format\u Bytes(大小(“1”x 3\u 100\u 000))。\n"
给出2.9G..我也得到了2.9GB。我认为内存缓冲区没问题,只是将其用作失败的文件句柄。是的,这是可能的。很好!这是怎么可能的?检查您是否可以使用
Number::Bytes::Human::size
Devel::size::size
:在我的笔记本电脑上,我可以访问大约4 GB…例如:
print format_bytes(大小(“1”x 3_100_000_000))。“\n”
提供2.9G..I也获得2.9GB。我认为内存缓冲区是可以的,只是将其用作失败的文件句柄。要使代码与5.8之前的Perl向后兼容,请使用
IO::String
模块..这在原则上对我来说是可行的,但不幸的是它不适用于大文件(>2GB)。在本例中,$file\u contents保存文件的内容,但返回一个空变量。有没有办法解决此问题?要使代码向后兼容早于5.8的Perl,请使用
IO::String
module..这在原则上对我有效,但不幸的是它不适用于大文件(>2 GB)。在本例中,$file\u contents保存文件的内容,但返回一个空变量。有没有办法解决这个问题?