web-dev-qa-db-ja.com

C ++での高速圧縮とC#での解凍

概観

私はクライアントサーバーアプリケーションに取り組んでいます。クライアントはC++(Windowsで動作し、Linuxをサポートする予定)で作成され、サーバーは.NET RESTfulサービスです。 HTTPが必要POSTサーバーへのデータ。データはユニコードstringであり、高速圧縮アルゴリズムを使用して圧縮する必要があります(CPUで軽くする必要があります)。サーバーで生のバイトを解凍して文字列を取得する必要があります。

問題

生のバイトを解凍できず、解凍プログラムの出力バッファーがそのまま残ります。

私は試した

Google Snappy を使用してみましたが、C/C++バージョンしかなく、.NETポートが完了していないようです。 LZ4 もチェックしました。圧縮/解凍はsingle言語で機能しますが、both-データを正しく解凍できません(解凍されたバイトが0に設定されています)。

質問

誰かが高速C/C++圧縮とC#解凍を使用してみましたか?何かお勧めですか?

クライアントアプリケーションは5%を超えるCPUを使用しないでください。これは、漠然とした要件です。私はgzipを試してみて、おそらく収縮することを計画していますが、そこで圧縮レベルを構成できるかどうか、またはC/C++とC#の両方で機能するかどうかはわかりません。クライアントは、ほぼリアルタイムのデータを小さなバッファーに収集し、そのバッファーがいっぱいになると、圧縮してPOSTします。 OSプロセス全体は、マシンのCPUの5%未満を使用します。バッファは1秒間に約2回投稿され、約2Kb /秒のトラフィックが発生します。

4
oleksii

興味のある方がいれば、結局 zlib からgzipを使用してしまいました。コメントで示唆されているように、LZ4が機能しない理由は決してわかりません。これは、エンディアンの問題か、64/32ビットの不一致である可能性があります。ただし、ローカルファイルを圧縮および解凍する単一のマシンでこれをテストしました。同じコンパイル設定がgzipでも機能しました。

C/C++サンプルコンプレッサコード

int compress_one_file(char *infilename, char *outfilename)
 {
    FILE *infile = fopen(infilename, "rb");
    gzFile outfile = gzopen(outfilename, "wb");
    if (!infile || !outfile) return -1;

    char inbuffer[128];
    int num_read = 0;
    unsigned long total_read = 0, total_wrote = 0;
    while ((num_read = fread(inbuffer, 1, sizeof(inbuffer), infile)) > 0) {
       total_read += num_read;
       gzwrite(outfile, inbuffer, num_read);
    }
    fclose(infile);
    gzclose(outfile);
 }

C#サンプル解凍プログラムコード

public static void Decompress(FileInfo fileToDecompress)
{
    using (FileStream originalFileStream = fileToDecompress.OpenRead())
    {
        string currentFileName = fileToDecompress.FullName;
        string newFileName = currentFileName + ".decompressed";

        using (FileStream decompressedFileStream = File.Create(newFileName))
        {
            using (GZipStream decompressionStream = 
                new GZipStream(originalFileStream, CompressionMode.Decompress))
            {
                decompressionStream.CopyTo(decompressedFileStream);
            }
        }
    }
}
8
oleksii

LZ4とSnappyの両方が最近.NETに移植されました。

LZ4 .NETポートは http://lz4net.codeplex.com にあります。
Snappy .NETポート(実際にはP/Invokeラッパー)は、ここ http://snappy4net.codeplex.com にあります。

ここで(.NETポートの)パフォーマンス比較 を確認することもできます。

あなたの質問に答えるために、私はC++圧縮とC#解凍の両方をテストするために使用しましたが、うまく機能します。

免責事項:はい、LZ4とSnappyの両方が移植/ラップされています。

5

7-ZipのLZMA形式を見てください。 ここ

私は圧縮ユーティリティ(SDKではなく)のみを使用しましたが、優れています。圧縮形式は言語とプラットフォーム間で移植可能であり、C#とC++の両方のサポートを主張しています

0
James Anderson