我想从gzip压缩文件中逐行向后阅读。我知道ReadBackwards模块,但是如何才能使它在gzip压缩文件上运行?我应该使用不同的模块吗?
答案 0 :(得分:7)
为什么要向后阅读?尝试向后读取压缩文件没有性能提升。您必须首先对其进行解压缩(以了解字节n意味着您必须先解压缩字节0 .. n)。
在速度方面你可能不会比:
更好#!/usr/bin/perl
use strict;
use warnings;
die "usage: $0 filename" unless defined(my $file = shift);
open my $fh, "<:gzip", $file
or die "could not open $file: $!";
my @lines;
while (<$fh>) {
push @lines, $_;
shift @lines if @lines > 10;
}
print @lines;
答案 1 :(得分:4)
你几乎需要首先解压缩文件。你不能(轻松地)随机搜索gziped文件。
答案 2 :(得分:0)
不要将文件存储在内存中。将其存储在SQLite或类似的数据库中,并在读取并插入数据库时使用行号的顺序索引字段。
当文件完全存储在DB中时,通过使用降序排序索引来向后遍历行。您可以根据需要快速跳转数据库,还可以使用数据库查询来查找行。如果你有足够的RAM或固态驱动器,它将没有那么快,但它比你正在谈论的处理压缩文件要快得多。 / p>
计算机编程就是在限制范围内工作时寻找创造性解决方案。您受RAM以及使用压缩文件这一事实的限制。您必须解压缩文件以向后移动它,但您无法将其放入RAM中。所以,你必须把数据放在某个地方,这几乎离开了磁盘。在数据库中向后移动比在平面文件中更容易,因此请使用数据库来获取它的好处,然后继续前进。
答案 3 :(得分:0)
我没有一个很好的测试方法,但是从this post我认为你可以用
打开文件open my $handle, '-|', '/usr/bin/gzcat', $filename;
这将允许您逐行浏览文件,如
foreach my $line (<$handle>) {
do stuff with $line ...
}
我的理解是,这不会污染整个文件,应该有助于大文件的内存。如果我错了,希望有人会来给我打鱼。
我也知道这是向前发展的,但我对你的希望是,现在你不需要从记忆的角度来看。如果您仍然这样做,您可以进行一些修改以将其与File :: Backwards一起使用。
现在,我的(Ubuntu)系统似乎没有gzcat
,但我发现很多参考文献都说gzcat
与zcat
或{{ 1}}或gunzip -c
等等,程序名称为YMMV。我再次希望这种方法合理。