2010-10-25 30 views
5

¿Qué método de compresión en Python tiene la mejor relación de compresión?Compresión con mejor relación en Python?

¿Es el zlib.compress() de uso común el mejor o hay algunas opciones mejores? Necesito obtener la mejor relación de compresión posible.

Estoy comprimiendo cadenas y enviándolas a través de UDP. Una cadena típica que comprime tiene aproximadamente 1,700,000 bytes.

Respuesta

6

Estoy seguro de que podría haber algunos formatos más oscuros con mejor compresión, pero lzma es el mejor, de los que están bien soportados. Hay algunos enlaces de python here.

EDITAR

no elige un formato sin pruebas, algunos algoritmos hacen mejor en función del conjunto de datos.

+0

Mi conjunto de datos es una cadena larga que representa una imagen de 640x480. –

+0

Si ya estaba usando un formato de imagen con un buen algoritmo de compresión, ¿es necesario comprimirlo todo de nuevo? – joni

+0

@joni La imagen no estaba tan bien comprimida. zlib.compress() lo redujo a cca 30% del tamaño original. Pero estoy buscando una compresión aún más drástica. –

4

Si está dispuesto a intercambiar el rendimiento para la compresión getter, la biblioteca bz2 suele dar mejores resultados que la biblioteca gz (zlib).

Existen otras bibliotecas de compresión como xz (LZMA2) que pueden dar mejores resultados pero no parecen estar en la distribución central de python.

Python Doc for BZ2 class

EDIT: Dependiendo del tipo de imagen que no podría obtener compresión mucho adicional. Muchos formatos de imagen están previamente comprimidos a menos que estén crudos, bmp o tiff sin comprimir. Las pruebas entre varios tipos de compresión serían muy recomendables.

EDIT2: Si decide hacer compresión de imagen. Image Magick admite enlaces de python y muchos tipos de conversión de imágenes.

Image Magick

Image Formats Supported

+0

Es una imagen en bruto. No comprimido zlib.compress() lo redujo al 30% de tamaño. –

+0

Dado que es una imagen sin formato, el enlace LZMA debería ser un poco mejor que la biblioteca BZ2. Como se sugirió anteriormente, debería poder usar una compresión de imagen sin pérdida con un resultado bueno/mejor. – CtRanger

+0

@CtRanger: ¿te refieres a * lossy * not * lossless *? ¿No es así? – kriss

2

Si se trata de imágenes que sin duda debe elegir un formato de compresión con pérdida (es decir: pixel conscientes) de preferencia a cualquier lossless uno. Eso te dará mejores resultados. La recompresión con un formato sin pérdida sobre uno con pérdida es una pérdida de tiempo.

Yo buscaría a través de PIL para ver lo que puedo usar. Algo como la conversión de imágenes a jpeg con una relación de compresión compatible con la calidad investigada antes del envío debería ser muy eficiente.

También debe tener mucho cuidado si usa UDP, puede perder algunos paquetes, y la mayoría del formato de compresión son muy sensibles a las partes faltantes del archivo. DE ACUERDO. Eso se puede gestionar a nivel de aplicación.

+0

¿Qué formato de compresión con pérdida recomiendas? –

+0

JPEG es un formato de imagen con buenas pérdidas, PNG es un formato de imagen sin pérdidas. No diría que la pérdida es siempre preferida, realmente depende de los datos. Lossy es preferido para imágenes ruidosas; fotos, escaneos, etc. Sin pérdida funciona bien para gráficos, dibujos lineales, etc. – adw

+0

@adw: Estoy de acuerdo contigo PNG y JPEG son buenos formatos, pero si tomas en cuenta la relación de compresión, jpeg es mucho mejor. Comprobé la compresión PNG y simplemente uso DEFLATE (el mismo algoritmo que se usa en zlib). – kriss