【发布时间】:2014-09-21 02:18:38
【问题描述】:
我有一个...很大的bigfile.gz.gz 文件。我想即时解压缩它。理想情况下,这就是我的想法:
$in = fopen('compress.zlib://compress.zlib://bigfile.gz.gz', 'rb');
while (!feof($in))
print fread($in, 4096);
fclose($in);
但是,compress.zlib:// 不能这样链接:
PHP Warning: fopen(): cannot represent a stream of type ZLIB as a File Descriptor in gztest.php on line 1
所以我想我会将gzopen() 和compress.zlib:// 组合在一起:
$in = gzopen('compress.zlib://bigfile.gz.gz', 'rb');
while (!gzeof($in))
print gzread($in, 4096);
gzclose($in);
但是,这只解压缩了一层 gzip。
我尝试了大概 10 种其他方法,不幸的是,gzopen() 不适用于 php://memory,如果它是使用 fwrite() 写入的。并且stream_filter_append(… zlib.inflate …) 无法读取压缩文件。
这是我能想到的最好的方法,但它会产生两个系统进程,这会产生不必要的开销:
$in = popen('zcat bigfile.gz.gz | gunzip', 'rb');
while (!feof($in))
print fread($in, 4096);
fclose($in);
有人可以提出更好的建议吗?
【问题讨论】:
-
为什么还要压缩两次呢? Afaik,这效率不高,因为它比第一轮后实际压缩的 CPU 成本更高。首先使用更高的压缩级别,而不是使用平均压缩级别压缩两次。
-
@DanFromGermany 因为
bigfile.gz是 302 MiB 而bigfile.gz.gz只有 22 MiB。 -
好吧,这出乎意料:)