0

我有 100M 个元素的 BitArray。这大约是 12.5M。我必须压缩这个数组。我使用 GZipStream 的 Framework 。

   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;
    }
}

但是变量compressedData的大小是12515308。它比原始数组大。有任何想法吗?

可能需要我另一个压缩机?

4

2 回答 2

1

您是否尝试过不使用随机数据?压缩良好的数据不是随机的。我相信常见的压缩算法会寻找位模式以进行压缩。作为一个简单的测试,您可以将这些随机字节写到一个文件中,然后查看压缩它时会发生什么。

于 2012-05-03T20:13:49.533 回答
0

没有压缩器可以压缩真正的随机数据。(正如所指出的,如果您可以推断出种子和算法,则可以压缩伪随机数据。)

你的应用是什么?你有真实的数据来测试它吗?

于 2012-05-03T23:47:36.313 回答