【问题标题】:Compress BitArray with GZip in C#在 C# 中使用 GZip 压缩 BitArray
【发布时间】:2012-05-03 20:04:23
【问题描述】:

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

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

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

【问题讨论】:

  • 压缩通过将短代码分配给数据中的常见序列和将长代码分配给稀有序列来工作。如果数据是完全随机的,那么频繁出现的序列并不多,因此结果可能会比原来的更长。解决方案:不要压缩随机数据。或者,如果必须,只需使用 PRNG(如 Random)并仅存储种子而不是生成的值(“程序生成”)。
  • 谢谢。我需要使用随机数据。我不能使用 GZip 。可能是另一个压缩机。这不完全是随机数,而是我使用的 fop POC random 。这就像用户的加密代码。它必须是随机的。
  • 在加密后进行压缩通常是一个坏主意(您会产生压缩开销,并且由于@dtb 提到的原因,实际大小减少会很小(如果有的话))。如果可能,请尝试在数据加密之前对其进行压缩,这样您将获得最佳结果。

标签: c# gzip gzipstream


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 呵呵呵呵如何将64KB的伪随机数压缩成四个字节:[SEED, STREAM_LENGTH]? :)
    猜你喜欢
    • 2013-10-01
    • 2011-03-02
    • 1970-01-01
    • 1970-01-01
    • 2015-07-14
    • 1970-01-01
    • 1970-01-01
    • 2016-10-15
    • 2012-06-17
    相关资源
    最近更新 更多