压缩字符串使用不同的字符带来不同的结果


Compressing string bring different results with differents chars

我正在尝试用PHP压缩一些字符串,但我有一些奇怪的结果。

我试过这个代码,它是在这里找到的

$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

一切都取决于压缩算法 - 有些会压缩得更慢,但会导致更好的压缩。

此外,压缩的数据类型会影响结果。 原始文件中的大量重复字符将压缩并创建一个较小的压缩文件。

在此处阅读有关不同压缩方法结果的更多信息:http://en.wikipedia.org/wiki/Data_compression

并非所有数据都可以同样好地压缩:例如,具有重复单词和可识别模式的文本比您可能在二进制文件中找到的随机字节序列更容易压缩。在不知道数据来源的情况下,压缩到 50-30% 听起来不错。

您应该知道压缩数据并不总是节省空间;结果甚至可能比原始数据更长。