我在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);
在这种情况下,如果文件大小为&lt;两种方法,则输出相同。 2 GB。如果文件较大,则slurping返回一个空行。
答案 0 :(得分:5)
读入文件:
use File::Slurp 'read_file';
read_file( "filename", buf_ref => \my $file_contents );
并打开文件句柄:
open my $file_handle, '<', \$file_contents;