Dav*_*d B 1 compression perl serialization gzip
我使用Perl生成相对较大的文件.我生成的文件有两种:
表文件,即文本文件我逐行(逐行)打印,主要包含数字.典型的线条如下:
126891 126991 14545 12
我创建的序列化对象然后使用存储到文件中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)中一样逐行打印?
的确Gzip听起来像一个合适的选择?aRe还有其他推荐的压缩机用于我描述的数据类型吗?
pack对象中的值是否有意义,以后将被存储和压缩?
我的考虑主要是节省磁盘空间并允许以后快速解压缩.
您可以使用IO::Zlib或PerlIO::gzip绑定文件句柄以便动态压缩.
至于适合的压缩器,只需尝试几个,看看它们对您的数据有何影响.还要注意它们用于压缩和解压缩的CPU /内存量.
再次,测试一下pack您的数据有多大帮助,以及它对您的性能有多大影响.在某些情况下,它可能会有所帮助.在其他情况下,它可能不会.这真的取决于你的数据.