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 に答える