Perl Readbackwards和gzipped文件

时间:2010-11-05 22:28:24

标签: perl gzip

我想从gzip压缩文件中逐行向后阅读。我知道ReadBackwards模块,但是如何才能使它在gzip压缩文件上运行?我应该使用不同的模块吗?

4 个答案:

答案 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,但我发现很多参考文献都说gzcatzcat或{{ 1}}或gunzip -c等等,程序名称为YMMV。我再次希望这种方法合理。