Сжатие BitArray с GZip в C#

У меня есть BitArray с элементами 100M. Это около 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;
    }
}

Но размер переменной сжатых данных составляет 12515308. Это больше, чем исходный массив. Есть идеи?

Может быть, мне нужен еще один компрессор?

2 ответа

Вы пытались не использовать случайные данные? Данные, которые хорошо сжимаются, не случайны. Я считаю, что обычные алгоритмы сжатия ищут шаблоны битов для сжатия. В качестве простого теста вы можете записать эти случайные байты в файл, а затем посмотреть, что произойдет, когда вы заархивируете его.

Ни один компрессор не может сжимать действительно случайные данные. (Как было указано, вы можете сжать псевдослучайные данные, если сможете определить начальное число и алгоритм.)

Какова ваша заявка? У вас есть реальные данные для проверки?

Другие вопросы по тегам