代码之家  ›  专栏  ›  技术社区  ›  pythonic metaphor

Perl readbackward和gzip文件

  •  2
  • pythonic metaphor  · 技术社区  · 15 年前

    4 回复  |  直到 15 年前
        1
  •  7
  •   Chas. Owens    15 年前

    你为什么要倒着读呢?尝试向后读取压缩文件不会提高性能。您必须先解压缩它(要理解字节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;
    
        2
  •  4
  •   Yann Ramin    15 年前

        3
  •  0
  •   the Tin Man    15 年前

    不要将文件存储在内存中。将其存储在SQLite或类似的数据库中,在读取行号并将其插入数据库时,使用行号的顺序索引字段。

    当文件完全存储在数据库中时,通过使用降序排序对索引进行排序,向后遍历行。您可以根据需要快速跳转数据库,还可以使用数据库查询来定位行。如果你有足够的RAM或固态硬盘,它不会像现在这样快,但它会比你所说的处理压缩文件快得多。

    计算机编程就是在有限的工作范围内寻找创造性的解决方案。您受到RAM和使用压缩文件这一事实的限制。你必须解压文件才能反向遍历它,但是你不能将它放入RAM中。所以,你必须把数据放在某个地方,而这几乎就只剩下磁盘了。与平面文件相比,向后遍历数据库更容易,因此可以使用数据库来实现它的优点,然后继续前进。

        4
  •  0
  •   Joel Berger    15 年前

    this post 我想你可以用

    open my $handle, '-|', '/usr/bin/gzcat', $filename;
    

    这将允许您逐行遍历文件,如

    foreach my $line (<$handle>) {
      do stuff with $line ...
    }
    

    我的理解是,这不会拖拉整个文件,应该有助于大文件的内存。如果我错了,希望有人会来打我一巴掌。

    我也知道这是向前发展的,但我对你的希望是,现在你不需要从记忆的角度倒退。如果您仍然这样做,也许您可以做一些修改,将其与File::Backwards一起使用。

    gzcat 在我的(Ubuntu)系统上,虽然我找到了很多这样的参考资料 zcat gunzip -c gzip -dc 所以节目名是YMMV。我再次希望这个方法是正确的。