Introducción

La compresión de datos es una técnica esencial en el procesamiento de datos masivos, ya que permite reducir el tamaño de los datos almacenados y transmitidos, optimizando así el uso de recursos y mejorando la eficiencia del sistema. En este módulo, exploraremos los conceptos básicos de la compresión de datos, los diferentes tipos de algoritmos de compresión y sus aplicaciones en el contexto de datos masivos.

Conceptos Básicos

¿Qué es la Compresión de Datos?

La compresión de datos es el proceso de transformar datos de tal manera que ocupen menos espacio en almacenamiento o menos ancho de banda en transmisión. Esto se logra eliminando redundancias y representando la información de manera más eficiente.

Tipos de Compresión

  1. Compresión Sin Pérdida (Lossless)

    • Definición: Técnica que permite recuperar los datos originales exactamente después de la descompresión.
    • Ejemplos: Algoritmos como Huffman, LZW (Lempel-Ziv-Welch), y DEFLATE.
    • Aplicaciones: Archivos de texto, bases de datos, y cualquier aplicación donde la pérdida de datos no es tolerable.
  2. Compresión con Pérdida (Lossy)

    • Definición: Técnica que elimina parte de los datos originales, permitiendo una mayor reducción de tamaño a costa de una pérdida de calidad.
    • Ejemplos: Algoritmos como JPEG para imágenes, MP3 para audio, y MPEG para video.
    • Aplicaciones: Multimedia, donde una pequeña pérdida de calidad es aceptable.

Métricas de Compresión

  • Ratio de Compresión: Relación entre el tamaño original y el tamaño comprimido. \[ \text{Ratio de Compresión} = \frac{\text{Tamaño Original}}{\text{Tamaño Comprimido}} \]
  • Velocidad de Compresión/Descompresión: Tiempo requerido para comprimir o descomprimir los datos.
  • Eficiencia de Compresión: Medida de cuán bien un algoritmo reduce el tamaño de los datos sin perder información relevante.

Algoritmos de Compresión

Algoritmos de Compresión Sin Pérdida

Huffman Coding

  • Descripción: Utiliza una tabla de frecuencias de los caracteres para construir un árbol binario de códigos, asignando códigos más cortos a los caracteres más frecuentes.
  • Ejemplo:
import heapq
from collections import defaultdict, Counter

def huffman_encoding(data):
    frequency = Counter(data)
    heap = [[weight, [symbol, ""]] for symbol, weight in frequency.items()]
    heapq.heapify(heap)
    
    while len(heap) > 1:
        lo = heapq.heappop(heap)
        hi = heapq.heappop(heap)
        for pair in lo[1:]:
            pair[1] = '0' + pair[1]
        for pair in hi[1:]:
            pair[1] = '1' + pair[1]
        heapq.heappush(heap, [lo[0] + hi[0]] + lo[1:] + hi[1:])
    
    return sorted(heapq.heappop(heap)[1:], key=lambda p: (len(p[-1]), p))

data = "this is an example for huffman encoding"
huff = huffman_encoding(data)
print("Symbol\tWeight\tHuffman Code")
for p in huff:
    print(f"{p[0]}\t{frequency[p[0]]}\t{p[1]}")

LZW (Lempel-Ziv-Welch)

  • Descripción: Construye un diccionario de cadenas vistas anteriormente y reemplaza las cadenas repetidas con referencias a este diccionario.
  • Ejemplo:
def lzw_compress(uncompressed):
    dict_size = 256
    dictionary = {chr(i): i for i in range(dict_size)}
    w = ""
    result = []
    for c in uncompressed:
        wc = w + c
        if wc in dictionary:
            w = wc
        else:
            result.append(dictionary[w])
            dictionary[wc] = dict_size
            dict_size += 1
            w = c
    if w:
        result.append(dictionary[w])
    return result

data = "TOBEORNOTTOBEORTOBEORNOT"
compressed = lzw_compress(data)
print("Compressed:", compressed)

Algoritmos de Compresión con Pérdida

JPEG (Joint Photographic Experts Group)

  • Descripción: Utiliza la transformada discreta del coseno (DCT) para convertir la imagen en el dominio de la frecuencia, luego aplica cuantización y codificación entropía.
  • Aplicación: Compresión de imágenes.

MP3 (MPEG-1 Audio Layer III)

  • Descripción: Utiliza la transformada de Fourier y la cuantización para reducir el tamaño del archivo de audio, eliminando las partes del sonido que son menos perceptibles para el oído humano.
  • Aplicación: Compresión de audio.

Aplicaciones en Datos Masivos

Almacenamiento

  • Reducción de Costos: La compresión reduce el espacio de almacenamiento necesario, disminuyendo los costos asociados.
  • Eficiencia de Almacenamiento: Mejora la eficiencia del almacenamiento en sistemas distribuidos y en la nube.

Transmisión

  • Reducción de Ancho de Banda: La compresión reduce la cantidad de datos que deben ser transmitidos, mejorando la velocidad y reduciendo los costos de transmisión.
  • Optimización de Redes: Mejora la eficiencia de las redes al reducir la cantidad de datos que deben ser manejados.

Ejercicios Prácticos

Ejercicio 1: Implementación de Huffman Coding

Instrucciones:

  1. Implementa el algoritmo de Huffman Coding en Python.
  2. Comprime una cadena de texto dada.
  3. Descomprime la cadena comprimida y verifica que coincida con la original.

Código Base:

# Implementación del algoritmo de Huffman Coding
import heapq
from collections import defaultdict, Counter

def huffman_encoding(data):
    frequency = Counter(data)
    heap = [[weight, [symbol, ""]] for symbol, weight in frequency.items()]
    heapq.heapify(heap)
    
    while len(heap) > 1:
        lo = heapq.heappop(heap)
        hi = heapq.heappop(heap)
        for pair in lo[1:]:
            pair[1] = '0' + pair[1]
        for pair in hi[1:]:
            pair[1] = '1' + pair[1]
        heapq.heappush(heap, [lo[0] + hi[0]] + lo[1:] + hi[1:])
    
    return sorted(heapq.heappop(heap)[1:], key=lambda p: (len(p[-1]), p))

def huffman_decoding(encoded_data, huff):
    reverse_huff = {code: symbol for symbol, code in huff}
    current_code = ""
    decoded_output = ""
    
    for bit in encoded_data:
        current_code += bit
        if current_code in reverse_huff:
            decoded_output += reverse_huff[current_code]
            current_code = ""
    
    return decoded_output

data = "this is an example for huffman encoding"
huff = huffman_encoding(data)
encoded_data = ''.join([dict(huff)[char] for char in data])
decoded_data = huffman_decoding(encoded_data, huff)

print("Original Data:", data)
print("Encoded Data:", encoded_data)
print("Decoded Data:", decoded_data)

Ejercicio 2: Comparación de Algoritmos de Compresión

Instrucciones:

  1. Implementa los algoritmos de compresión Huffman y LZW.
  2. Comprime una cadena de texto con ambos algoritmos.
  3. Compara el ratio de compresión y el tiempo de compresión para ambos algoritmos.

Código Base:

import time

# Implementación de Huffman Coding (ver código anterior)
# Implementación de LZW (ver código anterior)

data = "TOBEORNOTTOBEORTOBEORNOT"

# Huffman Compression
start_time = time.time()
huff = huffman_encoding(data)
encoded_data_huff = ''.join([dict(huff)[char] for char in data])
end_time = time.time()
huffman_time = end_time - start_time
huffman_ratio = len(data) * 8 / len(encoded_data_huff)

# LZW Compression
start_time = time.time()
compressed_lzw = lzw_compress(data)
end_time = time.time()
lzw_time = end_time - start_time
lzw_ratio = len(data) * 8 / (len(compressed_lzw) * 8)

print("Huffman Compression Time:", huffman_time)
print("Huffman Compression Ratio:", huffman_ratio)
print("LZW Compression Time:", lzw_time)
print("LZW Compression Ratio:", lzw_ratio)

Conclusión

La compresión de datos es una técnica fundamental en el procesamiento de datos masivos, permitiendo optimizar el almacenamiento y la transmisión de grandes volúmenes de datos. En este módulo, hemos explorado los conceptos básicos de la compresión de datos, los diferentes tipos de algoritmos de compresión y sus aplicaciones. Además, hemos proporcionado ejemplos prácticos y ejercicios para reforzar los conceptos aprendidos. En el siguiente módulo, profundizaremos en las técnicas de particionamiento y sharding para mejorar aún más la eficiencia del almacenamiento y procesamiento de datos masivos.

Procesamiento de Datos Masivos

Módulo 1: Introducción al Procesamiento de Datos Masivos

Módulo 2: Tecnologías de Almacenamiento

Módulo 3: Técnicas de Procesamiento

Módulo 4: Herramientas y Plataformas

Módulo 5: Optimización del Almacenamiento y Procesamiento

Módulo 6: Análisis de Datos Masivos

Módulo 7: Casos de Estudio y Aplicaciones Prácticas

Módulo 8: Buenas Prácticas y Futuro del Procesamiento de Datos Masivos

© Copyright 2024. Todos los derechos reservados