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