如何使用Perl动态编写压缩文件?

Dav*_*d B 1 compression perl serialization gzip

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

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

    126891 126991 14545 12

  2. 我创建的序列化对象然后使用存储到文件中Storable::nstore.这些对象通常包含一些带有数值的大哈希.可能已经pack编辑了对象中unpack的值以节省空间(并且在使用之前对象是每个值).

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

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: $!";
Run Code Online (Sandbox Code Playgroud)

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

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

  2. 的确Gzip听起来像一个合适的选择?aRe还有其他推荐的压缩机用于我描述的数据类型吗?

  3. pack对象中的值是否有意义,以后将被存储和压缩?

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

bdo*_*lan 8

  1. 您可以使用IO::ZlibPerlIO::gzip绑定文件句柄以便动态压缩.

  2. 至于适合的压缩器,只需尝试几个,看看它们对您的数据有何影响.还要注意它们用于压缩和解压缩的CPU /内存量.

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