0

我正在尝试用 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
4

2 回答 2

1

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

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

于 2013-09-20T17:34:26.273 回答
1

一切都取决于压缩算法 - 有些会压缩得更慢,并且会产生更好的压缩效果。

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

在这里阅读更多关于不同压缩方法的结果: http ://en.wikipedia.org/wiki/Data_compression

于 2013-09-20T17:35:44.883 回答