我正在尝试用PHP压缩一些字符串,但我有一些奇怪的结果。
我尝试过这个代码here
$string = str_repeat('1234567890'.implode('',range('a','z')),48800);
echo strlen($string);//1756800 bytes
$start = microtime(true);
$compressed = gzdeflate($string, 9);
$compressed = gzdeflate($compressed, 9);
$end = microtime(true);
var_dump($compressed);
echo '<br/>'.strlen($compressed).'<br/>';//99 bytes
$star2 = microtime(true);
echo gzinflate(gzinflate($compressed));
$end2 = microtime(true);
echo '</br>- '.($end-$start);
echo '</br>- '.($end2-$star2);
这个返回效果很好,像1756800字节变成99字节。这很好。
但是当我用真正的字符串为现实世界带来这个解决方案时,我试图压缩一个3606字节的字符串,它只变成了1765字节,并不是很好。
为什么这样?某些角色可以改变结果吗?
我尝试使用此代码来获得缩小50%的结果:
$text = file_get_contents ('doc/test.txt');
$xml = preg_split('/>/',$text , null, PREG_SPLIT_DELIM_CAPTURE);
unset($xml[0]);
unset($xml[1]);
foreach($xml as $p){
$compact = gzdeflate($p,9);
$compact = gzdeflate($compact,9);
var_dump(strlen($compact));
var_dump(strlen($p));
}
我有这样的结果:
int(1760) < compressed
int(3606) < normal
int(2441) < compressed
int(5878) < normal
答案 0 :(得分:1)
并非所有数据都可以同样压缩:具有重复单词和可识别模式的文本比您在二进制文件中可能找到的随机字节序列更容易压缩。在不知道数据来源的情况下,压缩到50-30%听起来相当不错。
您应该知道压缩数据并不总能节省空间;结果甚至可能比原来的更长。
答案 1 :(得分:1)
全部取决于压缩算法 - 有些会压缩得更慢并且会产生更好的压缩效果。
此外,压缩的数据类型会影响您的结果。原始文件中的大量重复字符将压缩并创建一个较小的压缩文件。
在此处阅读有关不同压缩方法的结果的更多信息: http://en.wikipedia.org/wiki/Data_compression