0

100M 要素の BitArray があります。これは約 12.5M です。この配列を圧縮する必要があります。Framework の GZipStream を使用しています。

   public static byte[] Compress(byte[] bytData)
    {
        try
        {
            MemoryStream ms = new MemoryStream();
            Stream s = new GZipStream(ms, CompressionMode.Compress);
            s.Write(bytData, 0, bytData.Length);
            s.Close();
            byte[] compressedData = ms.ToArray();
            return compressedData;
        }
        catch
        {
            return null;
        }
    }

    static void Main(string[] args)
    {
        BitArray t = GetArray();
        byte []byteArray = new byte[100000000/8];
        t.CopyTo(byteArray, 0);
        byte[] compressedData = Compress(byteArray);
        Console.WriteLine(compressedData.Length);
    }
    public static BitArray GetArray()
    {
        Random r = new Random();
        BitArray result = new BitArray(100000000);
        for (int i = 0; i < result.Count; i++)
        {
            if (r.NextDouble() > .5)
            {
                result.Set(i, true);
            }
        }
        return result;
    }
}

しかし、可変圧縮データのサイズは 12515308 です。元の配列よりも大きくなっています。何か案は?

別のコンプレッサーが必要ですか?

4

2 に答える 2

1

ランダムデータを使用しないようにしましたか? よく圧縮されるデータはランダムではありません。一般的な圧縮アルゴリズムは、圧縮するためにビットのパターンを探すと思います。簡単なテストとして、これらのランダムなバイトをファイルに書き出し、圧縮するとどうなるかを確認できます。

于 2012-05-03T20:13:49.533 に答える
0

真にランダムなデータを圧縮できるコンプレッサーはありません。(指摘されたように、シードとアルゴリズムを推測できる場合は、疑似ランダムデータを圧縮できます。)

あなたのアプリケーションは何ですか?テストするための実際のデータはありますか?

于 2012-05-03T23:47:36.313 に答える