Comprimir BitArray con GZip en C#

Tengo BitArray con 100 millones de elementos. Esto es alrededor de 12.5 millones. Tengo que comprimir esta matriz. Yo uso GZipStream de 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;
    }
}

Pero el tamaño de la variablepressedData es 12515308. Es más grande que la matriz original. ¿Algunas ideas?

¿Puede ser que necesite otro compresor?

preguntado el 03 de mayo de 12 a las 21:05

La compresión funciona asignando códigos cortos a secuencias comunes en los datos y códigos largos a secuencias raras. Si los datos son completamente aleatorios, no hay muchas secuencias que ocurran con frecuencia, por lo que el resultado puede terminar siendo más largo que el original. Solución: no comprima datos aleatorios. O si es necesario, simplemente use un PRNG (como Random) y almacene solo la semilla en lugar de los valores generados ("generación por procedimientos"). -

Gracias. Necesito usar datos aleatorios. No puedo usar GZip. Puede ser otro compresor. Esto no es exactamente números aleatorios, pero fop POC que uso random . Esto es como el código de cifrado de los usuarios. Debe ser aleatorio. -

Comprimir después de cifrar es a menudo una mala idea (usted incurre en la sobrecarga de compresión y habrá una reducción mínima, si la hay, del tamaño real por el motivo mencionado por @dtb). Si es posible, intente comprimir los datos antes de cifrarlos, ahí es cuando obtendrá los mejores resultados. -

2 Respuestas

¿Has probado a no usar datos aleatorios? Los datos que se comprimen bien no son aleatorios. Creo que los algoritmos de compresión comunes buscan patrones de bits para comprimir. Como prueba simple, puede escribir esos bytes aleatorios en un archivo y luego ver qué sucede cuando lo comprime.

contestado el 03 de mayo de 12 a las 21:05

Ningún compresor puede comprimir datos verdaderamente aleatorios. (Como se señaló, puede comprimir datos pseudoaleatorios si puede deducir la semilla y el algoritmo).

¿Cuál es tu aplicación? ¿Tienes datos reales para probarlo?

contestado el 04 de mayo de 12 a las 00:05

Jejeje, ¿cómo comprimir 64 KB de un número pseudoaleatorio en cuatro bytes: [SEED, STREAM_LENGTH]? :) - Jsideris

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.