Perl查找或读取并丢弃结果
我正在读取一个打开的文件句柄,如下所示:Perl查找或读取并丢弃结果,perl,io,Perl,Io,我正在读取一个打开的文件句柄,如下所示: open(my $fh, "-|", "zcat test.csv.gz") or die "Cannot open test.csv.gz: $!"; read $fh, ???, 256; print ">>", readline($fh), "<<\n"; close $fh; open(my$fh,“-|”,“zcat test.csv.gz”)或die“Cannot open test.csv.gz:$!”; 读
open(my $fh, "-|", "zcat test.csv.gz") or die "Cannot open test.csv.gz: $!";
read $fh, ???, 256;
print ">>", readline($fh), "<<\n";
close $fh;
open(my$fh,“-|”,“zcat test.csv.gz”)或die“Cannot open test.csv.gz:$!”;
读作$fh,?256;
打印“>>”,读线($fh),“256字节,这肯定是一个微观优化。对于256MB这样的较大搜索,请找到您愿意(暂时)牺牲的内存量并执行多次读取
use List::Util qw( min );
# Making $BUFFER_SIZE a multiple of 16 KiB covers makes sure the read is efficient.
my $BUFFER_SIZE = 65_536;
my $n = 256_000_000;
my $buffer = "";
while ($n) {
my $bytes_read = sysread($fh, $buffer, min($BUFFER_SIZE, $n));
die($!) if !defined($bytes_read);
die("Premature EOF") if !$bytes_read;
$n -= $bytes_read;
}
# Doesn't necessarily return memory back to the OS,
# but it does makes it available for Perl.
undef $buffer;
修复了一些问题:1)read
(和sysread
)返回的量可能小于请求的量,特别是在从普通文件以外的其他文件读取时。2)sysread
比read
更有效,因为它是一个开销小得多的单个系统调用。sysread
不支持PerlIO层(例如:encoding
),因此,如果您使用这些选项,请切换回read
。3)IO缓冲区大小在不久前被切换到8 KiB。当然,对于sysread
,这并不重要。好的,因此必须使用一个具有良好大小缓冲区的while循环并重复读取。是的,我确实在尝试查找接近数千GB文件结尾的文件,256只是为了说明。这似乎工作得很好。Re“我试过了,seek()什么也不做。”,它返回errorESPIPE