Erstellen von bzip2 archivierten Daten in PHP ist sehr einfach dank seiner Implementierung in bzcompress. In meiner gegenwärtigen Anwendung kann ich nicht einfach die Eingabedatei in einen String lesen und dann bzcompress
oder bzwrite
aufrufen. Die PHP-Dokumentation macht nicht klar, ob aufeinanderfolgende Aufrufe an bzwrite
mit relativ kleinen Datenmengen das gleiche Ergebnis liefern, als wenn die gesamte Datei auf einen Schlag komprimiert würde. Ich meine etwas entlang der Linien vonPiecemeal bzcompression für große Dateien in PHP
$data = file_get_contents('/path/to/bigfile');
$cdata = bzcompress($data);
Ich versuchte unter
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');
diesen Code zu testen ich zwei Dinge
-
hat gezeigt, ein Stück für Stück bzcompression mit den Routinen aus
- I verwendet
makeBZFile
undunmakeBZFile
, um eine SQLite-Datenbank zu komprimieren und dann zu dekomprimieren - was ich schließlich tun muss. - Ich habe eine 50Mb mit Zufallsdaten gefüllt
dd if=/dev/urandom of='/tmp.test.rnd bs=50M count=1
In beiden Fällen I a diff original.file decompressed.file
durchgeführt und festgestellt, dass die beiden identisch waren.
Alles sehr nett, aber es ist mir nicht klar, warum das funktioniert. Die PHP-Dokumentation besagt, dass bzread(bzpointer,length)
ein Maximum length
Bytes von UNCOMPRESSED Daten liest. Wenn mein Code unten Woring ist, ist, weil ich die bzwite
und bzread
Größe auf 10240 Bytes erzwinge.
Was kann ich nicht sehen, ist nur, wie bzread
weiß, wie lenth
Bytes UNCOMPRESSED Daten zu holen. Ich habe die format of a bzip2 file ausgecheckt. Ich kann nicht sehen, dass es dort etwas gibt, das hilft, die unkomprimierte Datenlänge für einen Block der .bz-Datei leicht herzustellen.
Ich vermute, es gibt eine Lücke in meinem Verständnis davon, wie das funktioniert - oder die Tatsache, dass mein Code unten scheint, um eine korrekte stückweise Komprimierung durchzuführen, ist rein zufällig.
Ich würde gerne ein paar Erklärungen hier zu schätzen wissen.
danke für die Antwort. Sie haben vielleicht bemerkt, dass ich in meiner Frage einen Link zum BZIP-Dateiformat angegeben habe, das ich vor dem Stellen der Frage studiert hatte. Ihre Antwort hilft zu verstehen, wie der 'bzwrite' Daten stückweise schreibt. Es ist mir weniger klar, wie es 'bzread' gelingt, die angegebene Anzahl * unkomprimierter * Bytes zu lesen. Vorausgesetzt, dass der Grad der Komprimierung abhängig von den Daten in jedem Block variieren wird, ist es nicht so einfach zu denken "* er will X Bytes von unkomprimierten Daten, so lass mich nur die nächsten X/unkomprimierten_size Blöcke holen" – DroidOS
Es ist nicht die glatte Jacke Formel zum Lesen von Bytes in Unkomprimierungsbytes. Zuerst wird der Huffman-Baum im Speicher decodiert und entsprechend dem Baum werden die komprimierten Daten unkomprimiert. – Vineet1982
Alles, was du noch wissen musst, lass es mich wissen oder akzeptiere die Antwort – Vineet1982