【问题标题】:How can I write compressed files on the fly using Perl?如何使用 Perl 即时编写压缩文件?
【发布时间】:2010-09-28 06:00:50
【问题描述】:

我正在使用 Perl 生成相对较大的文件。我生成的文件有两种:

  1. 表格文件,即我逐行(逐行)打印的文本文件,主要包含数字。典型的行如下所示:

    126891 126991 14545 12

  2. 我创建的序列化对象然后使用Storable::nstore 存储到一个文件中。这些对象通常包含一些带有数值的大散列。对象中的值可能已被packed 以节省空间(对象unpacks 在使用它之前的每个值)。

目前我通常在做以下事情:

use IO::Compress::Gzip qw(gzip $GzipError);

# create normal, uncompressed file ($out_file)
# ...

# compress file using gzip
my $gz_out_file = "$out_file.gz";
gzip $out_file => $gz_out_file or die "gzip failed: $GzipError";

# delete uncompressed file
unlink($out_file) or die "can't unlink file $out_file: $!";

这是非常低效的,因为我首先将大文件写入磁盘,然后gzip 再次读取并压缩它。所以我的问题如下:

  1. 我可以在不先将文件写入磁盘的情况下创建压缩文件吗?是否可以按顺序创建压缩文件,即像前面描述的场景(1)一样逐行打印?

  2. Gzip 听起来是不是一个合适的选择? a对于我所描述的数据类型,还有其他推荐的压缩器吗?

  3. 对象中的pack 值是否有意义,以后无论如何都会被存储和压缩?

我的考虑主要是节省磁盘空间并允许以后快速解压。

【问题讨论】:

  • 尽量不要在同一个问题中问多个问题。对于仅对您的某些问题有答案的人来说,这很难回答......
  • 那你有什么建议?复制三个不同问题的序言?
  • 是的。复制粘贴并不难 :) 确保将每个问题链接到其他问题,并使标题明显不同,因此很明显,您不仅仅是在复制同一个问题。
  • @bdonlan。谢谢,我下次再做。

标签: perl serialization gzip compression


【解决方案1】:
  1. 您可以使用IO::ZlibPerlIO::gzip 绑定文件句柄以进行动态压缩。

  2. 至于什么压缩器是合适的,试试几个,看看它们对你的数据有什么作用。还要留意他们用于压缩和解压缩的 CPU/内存量。

  3. 同样,测试一下pack 对您的数据有多大帮助,以及它对您的性能有多大影响。在某些情况下,它可能会有所帮助。在其他情况下,可能不会。这真的取决于你的数据。

【讨论】:

  • 只是为了好奇,是否有具有相同功能的 PerlIO 层?
【解决方案2】:

您还可以将文件句柄 open() 到标量而不是实际文件,并将此文件句柄与 IO::Compress::Gzip 一起使用。还没有真正尝试过,但它应该可以工作。我使用与 Net::FTP 类似的东西来避免在磁盘上创建文件。

从 v5.8.0 开始,Perl 默认使用 PerlIO 构建。除非您已更改此设置(即配置 -Uuseperlio),否则您可以通过以下方式将文件句柄直接打开到 Perl 标量:

open($fh, '>', \$variable) || ..

来自open()

【讨论】:

    【解决方案3】:

    IO::Compress::Zlib 有一个 OO 接口可用于此。

    use strict;  
    use warnings;
    use IO::Compress::Gzip;
    
    my $z = IO::Compress::Gzip->new('out.gz');
    $z->print($_, "\n") for 0 .. 10;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-08
      • 1970-01-01
      相关资源
      最近更新 更多