キャッシュファイル用に可逆圧縮で圧縮展開が高速な圧縮方式を探したところ、LZ4が見つかったので試してみたいと思います。
無圧縮のBMPファイルをLZ4で圧縮してみました。
プロジェクトの作成
cd (mkdir LZ4Sample01 -Force)
dotnet new console -f net8.0
dotnet add package K4os.Compression.LZ4
サンプルプログラム
using K4os.Compression.LZ4;
using System.Diagnostics;
using System.IO;
class Program
{
static void Main()
{
const string srcFile = @"G:\testdata\00005.bmp";
const string archiveFile = @"G:\testdata\00005.lz4";
const string destFile = @"G:\testdata\00005_out.bmp";
// ファイルサイズの取得
var info = new FileInfo(srcFile);
Console.WriteLine($"元ファイルのサイズ:{info.Length}B");
// 読み込み
byte[] rawImageData = File.ReadAllBytes(srcFile);
Stopwatch sw = new();
// 圧縮
using var fs = File.Create(archiveFile);
sw.Start();
var compressed = LZ4Pickler.Pickle(rawImageData);
sw.Stop();
fs.Write(compressed, 0, compressed.Length);
Console.WriteLine($"圧縮後のサイズ:{compressed.Length}B");
Console.WriteLine($"圧縮時間:{sw.ElapsedMilliseconds}ms");
// 展開
using var fs2 = File.Create(destFile);
sw.Restart();
byte[] raw = LZ4Pickler.Unpickle(compressed);
sw.Stop();
fs2.Write(raw, 0, raw.Length);
Console.WriteLine($"展開後のサイズ:{raw.Length}B");
Console.WriteLine($"展開時間:{sw.ElapsedMilliseconds}ms");
}
}
実行結果
dotnet run
元ファイルのサイズ:3048138B
圧縮後のサイズ:1925747B
圧縮時間:14ms
展開後のサイズ:3048138B
展開時間:6ms
圧縮と展開速度は評判どおり高速でした。
また、ファイルサイズは63%程度に圧縮されました。意外と小さくなった思います。
コメント