Sample code for 30+ languages & platforms
Perl Requires Chilkat v11.0.0+

Decompress Large Text File in Blocks

See more Compression Examples

Decompresses a large text file in blocks, and compares the restored (decompressed) file with the original to make sure it's correct.

Chilkat Perl Downloads

Perl
use chilkat();

$success = 0;

#  This example requires the Chilkat API to have been previously unlocked.
#  See Global Unlock Sample for sample code.

#  First, let's compress a text file.
#  We'll then decompress in blocks, and compare the decompressed with the original file.

#  Compress a text file:
$compress = chilkat::CkCompression->new();
$compress->put_Algorithm("deflate");

$success = $compress->CompressFile("qa_data/hamlet.xml","qa_data/hamlet_compressed.dat");
if ($success == 0) {
    print $compress->lastErrorText() . "\r\n";
    exit;
}

$fac = chilkat::CkFileAccess->new();

#  Examine the uncompressed and compressed sizes:
$originalPath = "qa_data/hamlet.xml";
#  Note: The FileSize method returns a signed 32-bit integer.  If the file is potentially larger than 2GB, call FileSizeStr instead to return
#  the size of the file as a string, then convert to an integer value.
print "uncompressed size: " . $fac->FileSize($originalPath) . "\r\n";
print "compressed size: " . $fac->FileSize("qa_data/hamlet_compressed.dat") . "\r\n";

#  Decompress in blocks..
$facSrc = chilkat::CkFileAccess->new();
$facDest = chilkat::CkFileAccess->new();

$facSrc->OpenForRead("qa_data/hamlet_compressed.dat");

#  If we compress in 32K chunks, find out how many blocks there will be.
$blockSize = 32768;
$numBlocks = $facSrc->GetNumBlocks($blockSize);

#  Open an output file for the decompressed data.
$restoredPath = "qa_output/hamlet_restored.xml";
$success = $facDest->OpenForWrite($restoredPath);
if ($success == 0) {
    print $facDest->lastErrorText() . "\r\n";
    exit;
}

$compressedBytes = chilkat::CkByteData->new();

#  Assuming numBlocks > 1
$compress->put_FirstChunk(1);
$compress->put_LastChunk(0);

$i = 0;
while ($i < $numBlocks) {
    $success = $facSrc->ReadBlock($i,$blockSize,$compressedBytes);
    $decompressedStr = $compress->decompressString($compressedBytes);

    $facDest->AppendText($decompressedStr,"utf-8");

    $i = $i + 1;

    $compress->put_FirstChunk(0);
    if ($i == ($numBlocks - 1)) {
        $compress->put_LastChunk(1);
    }

}

$facSrc->FileClose();
$facDest->FileClose();

#  Examine the size of the restored file.
print "restored size: " . $fac->FileSize($restoredPath) . "\r\n";

#  Compare the contents of the original with the restored.
$bEqualContents = $fac->FileContentsEqual($restoredPath,$originalPath);
print "Contents Equal: " . $bEqualContents . "\r\n";