perl - Perl 查找或读取并丢弃结果
问题描述
我正在读取打开的文件句柄,如下所示:
open(my $fh, "-|", "zcat test.csv.gz") or die "Cannot open test.csv.gz: $!";
read $fh, ???, 256;
print ">>", readline($fh), "<<\n";
close $fh;
现在,我想寻找一个已知位置,在这种情况下为 256 个字节。
我找不到,因为这是一个基于另一个程序的 STDOUT 的文件句柄。我试过了,而 seek() 什么也没做。我可以读取和丢弃数据,但是当寻找一个大的结果时,这会浪费内存加载和丢弃它。
我可以投入什么???这就像 /dev/null?还是有其他方法?
解决方案
对于 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;
推荐阅读
- python - python pandas中的列和行中的多个过滤器
- excel - 如何将某些特定数据从一个 excel WB 导出到另一个?
- python-3.x - 从 (2n+1) 个元素计算四分位数时,Pandas 返回意外结果
- c - 将 C typedef 结构转换为 Swift
- python - 加载这种边缘列表文件格式的正确方法是什么?
- php - SearchFacesByImage 中的 Rekognition InvalidS3ObjectException 错误(400 Bad Request.. 无法从 S3 获取对象元数据)
- object - 在对象赋值解构Javascript中使用冒号
- postgresql - 无法访问 Postgresql 上的数据库?
- regex - 在 Python 中验证一组日期的方法
- c# - 如何使用 tcp 服务器在 c# 和 python 中交换命令