2010-01-02 16 views
5

Ya busqué en Google la compresión en la memoria y encontré bastantes bibliotecas que ofrecen esta funcionalidad. el zlib parece ser ampliamente utilizado, pero también parece ser bastante antiguo. Pregunto aquí si hay alternativas mejores y más nuevas.C++ ¿Qué biblioteca de compresión en memoria?

Los datos que quiero comprimir en la memoria son contenedores de memoria con un tamaño de algunos megabytes (2-16 MB) y cada uno de esos bloques contiene datos de dos estructuras diferentes, así como algunas matrices de punteros. dentro de los bloques, no hay un orden particular para las estructuras y las matrices, solo se asignan después de otro cuando la aplicación necesita crear dicho elemento.

¿Qué lib de compresión sugeriría para esto? el rendimiento de compresión y descompresión (ambos) son más importantes que la calidad de compresión.

Además, por razones de compresión, ¿sería mejor tener pools separados para las dos estructuras diferentes, así como las matrices, de modo que cada bloque de datos comprimido solo contenga un tipo de datos?

Esta es la primera vez que pretendo usar la compresión en la memoria y sé que mi pregunta es tal vez demasiado general para dar una buena respuesta, ¡pero cada pista es bienvenida!

thx!

+1

Me sorprendería si cualquier biblioteca de compresión tratara correctamente con los punteros. –

+1

los punteros, de hecho, son solo desplazamientos de dirección al inicio del grupo – Mat

Respuesta

9

zlib es bueno. Probado, realizado y entendido por muchos. Es lo que usaría de forma predeterminada en un nuevo sistema como lo que describes. Su edad debe ser vista como uno de sus mayores activos.

0

No tengo conocimiento de nada nuevo/mejor que zlib ... zlib funciona bien, a pesar de su edad. zlib's deflateInit() tiene un argumento que le permite intercambiar la velocidad de compresión contra el tamaño comprimido, por lo que puede experimentar con eso para encontrar la configuración que funcione mejor para su aplicación.

Probablemente existan las API de envoltura de C++ que llamen a la API zlib C por ti, si quieres algo "más bonito" ... o si no lo hay, es bastante fácil escribir el tuyo.

+1

En algunas (¿muchas?) Aplicaciones, el mando de resistencia a la compresión de zlib no es tan útil. Puede hacer que la compresión tarde bastante, pero puede no reducir el tamaño de salida tanto como simplemente usar un sistema diferente (como bzip2, que puede hacer una compresión más extrema que zlib en su configuración máxima, aunque a un alto costo en velocidad) Aún así, es bueno señalarlo. –

3

Para algo más moderno que zlib, libbzip2 podría valer la pena echarle un vistazo. Proporciona una interfaz similar a zlib, para compatibilidad. En muchos casos, ofrece una mejor compresión, pero a un costo de rendimiento.

Para algo más rápido que zlib (pero que no se comprime tan bien ...) hay LZO.

+0

bzip2 no es apropiado cuando la alta velocidad es un requisito. –

+0

(como ya he dicho, mejor compresión, pero a un costo de rendimiento) – user242275

1

No tiene sentido hacer esto en los sistemas operativos modernos con un administrador de memoria virtual. Creará una burbuja de bytes que no son útiles para nada, ocupando espacio en el espacio de direcciones de la memoria virtual sin una buena razón. El administrador de memoria no lo dejará en RAM durante mucho tiempo, notará que las páginas ocupadas por el blob no están siendo accedidas y lo intercambiará al archivo de paginación.

Además, tendrá que traducir los datos si contiene punteros. Las probabilidades de que pueda descomprimir los datos en la misma dirección de memoria virtual, para que los punteros sigan siendo válidos, son muy cercanas a cero. Después de todo, usted hizo esto para liberar espacio en la memoria virtual, el agujero previamente utilizado por los datos será ocupado por otra cosa. Esta traducción probablemente no sea trivial y requerirá mucha memoria adicional.

Si está haciendo esto para evitar OOM, consulte la compatibilidad del sistema operativo para archivos mapeados en memoria y considere cambiar a código de 64 bits.

+0

los punteros son desplazamientos de direcciones en los pools de memoria. Realmente no entendí el problema con la paginación. Necesito compresión porque tengo un sistema en tiempo real que crea y reutiliza una gran cantidad de datos – Mat

+0

¡La paginación no siempre está disponible! P.ej. Lo desactivé en mi máquina, ya que lo hace mucho más receptivo y no agota mi SSD. – abergmeier

1

Si la velocidad de compresión/descompresión es importante para usted, usted debe echar un vistazo a LZO:

http://www.oberhumer.com/opensource/lzo/

En comparación con zlib el código más pequeño y más fácil de usar también.

0

Para la compresión, los datos son muy importantes. La compresión de datos binarios arbitrarios en la memoria es una completa pérdida de tiempo, reducirá enormemente su rendimiento y probablemente terminará haciendo que su uso de la memoria sea más alto.

Si realmente necesita tener mucha más memoria, debería utilizar VirtualAlloc o sbrk para controlar la memoria usted mismo. De esta manera puede abordar TODA la memoria física, no solo de 2 a 4 gb.

Cuestiones relacionadas