bzcompressの実装のおかげで、PHPでbzip2のアーカイブデータを作成するのは非常に簡単です。私の現在のアプリケーションでは、すべての理由で入力ファイルを文字列に読み込み、bzcompress
またはbzwrite
を呼び出すことはできません。比較的少量のデータでbzwrite
を連続して呼び出すと、1回のスウォープでファイル全体を圧縮する場合と同じ結果が得られるかどうかは、PHPのドキュメントではわかりません。私はmakeBZFile
を使用し、私は二つのことPHPの大きなファイルのための細かいbzcompression
- をした
$data = file_get_contents('/path/to/bigfile'); $cdata = bzcompress($data);
の線に沿って何か私はこのコードをテストするには
function makeBZFile($infile,$outfile) { $fp = fopen($infile,'r'); $bz = bzopen($outfile,'w'); while (!feof($fp)) { $bytes = fread($fp,10240); bzwrite($bz,$bytes); } bzclose($bz); fclose($fp); } function unmakeBZFile($infile,$outfile) { $bz = bzopen($infile,'r'); while (!feof($bz)) { $str = bzread($bz,10240); file_put_contents($outfile,$str,FILE_APPEND); } } set_time_limit(1200); makeBZFile('/tmp/test.rnd','/tmp/test.bz'); unmakeBZFile('/tmp/test.bz','/tmp/btest.rnd');
下に示したルーチンを使用して断片的なbzcompressionを試してみたことを意味し、
unmakeBZFile
を圧縮してから、SQLiteデータベースを圧縮解除してください。これは最終的に必要な作業です。 - 私は
diff original.file decompressed.file
を行い、両者が同一であったことが分かったランダムデータの両方の場合においてdd if=/dev/urandom of='/tmp.test.rnd bs=50M count=1
で満たさ50MBを作成しました。
非常にいいですが、なぜこれが機能しているのかはわかりません。 PHPドキュメントでは、bzread(bzpointer,length)
は最大length
バイト、のデータは、というデータがありません。私のコードが以下のようなものなら、それはbzwite
とbzread
のサイズを10240バイトに強制しているからです。
私が見ることができないことbzread
がUNCOMPRESSEDデータのlenth
バイトをフェッチする方法を知っているだけの方法です。私はformat of a bzip2 fileをチェックアウトしました。 .bzファイルのチャンクの非圧縮データ長を簡単に確立するのに役立つ情報はありません。
私はこれがどのように機能するかについての私の理解に間違いがあると思っています。そうでなければ、以下の私のコードが正しく断片的な圧縮を実行するように見えるという事実はまったく偶然です。
ここではいくつかの説明をよく読んでいただきたいと思います。
を説明したが答えてくれてありがとう。私の質問では、私は質問をする前に私が研究していたBZIPファイル形式へのリンクを提供していることに気づいたかもしれません。あなたの答えは 'bzwrite'が断片的にデータを書き込む方法を理解するのに役立ちます。 'bzread'が指定された数の*圧縮されていない*バイトをどのように管理するかは、私にはあまり明確ではありません。圧縮の程度は各ブロックのデータによって異なりますので、「* Xバイトの非圧縮データが必要なので、次のX/uncompressed_sizeブロックを取得してください」 – DroidOS
ストレートジャケットではありません圧縮されていないバイトでバイトを読み取るための式。最初に、ハフマンツリーはメモリ内でデコードされ、ツリーに従って圧縮データは圧縮解除される。 – Vineet1982
あなたが知る必要があることは何でも知っておくか、答えを受け入れる – Vineet1982