La codificación delta es una forma de almacenar o transmitir datos en forma de diferencias (deltas) entre datos secuenciales en lugar de archivos completos; en términos más generales, se conoce como diferenciación de datos . A veces, la codificación delta se denomina compresión delta , especialmente cuando se requieren historiales de cambios archivados (por ejemplo, en software de control de versiones ).
Las diferencias se registran en archivos independientes llamados «deltas» o «diffs». En situaciones donde las diferencias son pequeñas —por ejemplo, el cambio de unas pocas palabras en un documento extenso o el cambio de unos pocos registros en una tabla grande— la codificación delta reduce considerablemente la redundancia de datos. Las colecciones de deltas únicos son mucho más eficientes en cuanto al uso del espacio que sus equivalentes sin codificar.
Desde un punto de vista lógico, la diferencia entre dos valores de datos es la información necesaria para obtener un valor a partir del otro; véase entropía relativa . La diferencia entre valores idénticos (bajo alguna equivalencia ) se denomina a menudoo el elemento neutro.
Ejemplo numérico
Quizás el ejemplo más sencillo sea almacenar valores de bytes como diferencias (deltas) entre valores secuenciales, en lugar de los valores mismos. Entonces, en lugar de, almacenaríamosEsto reduce la varianza (rango) de los valores cuando las muestras vecinas están correlacionadas, lo que permite un menor uso de bits para los mismos datos. El formato de sonido IFF 8SVX aplica esta codificación a los datos de sonido sin procesar antes de aplicarles compresión. Ni siquiera todas las muestras de sonido de 8 bits se comprimen mejor cuando se codifican con delta, y la utilidad de la codificación delta es aún menor para muestras de 16 bits o superiores. Por lo tanto, los algoritmos de compresión a menudo eligen la codificación delta solo cuando la compresión es mejor que sin ella. Sin embargo, en la compresión de vídeo , los fotogramas delta pueden reducir considerablemente el tamaño del fotograma y se utilizan en prácticamente todos los códecs de compresión de vídeo . Estos fotogramas requieren un tipo diferente de cálculo delta .
Definición
Numérico
La diferencia de valores numéricos se define directamente mediante la resta, como se muestra en el ejemplo anterior. Debido a la propiedad de las operaciones aritméticas, la diferencia numérica es simétrica : si el último valor es igual a cero, entonces es igual a cero.Se sabe que es posible aplicar el delta.en sentido inverso para obtener el valor anterior.
También es posible producir un "delta de deltas" numérico. Esto puede ser útil si los datos subyacentes se generan mediante un proceso similar a, ya que el delta de segundo orden aplanaría los datos a una cadena de ceros. Las marcas de tiempo a menudo se comportan de esta manera. [ 1 ] Incluso los deltas de orden superior pueden ser útiles para datos de la vida real: por ejemplo, la distancia medida ( pseudorango ) a un satélite de navegación a lo largo del tiempo se comprime mejor utilizando un delta de tercer orden, un "delta de deltas de deltas". [ 2 ]
Además de la resta, la operación XOR (o exclusiva ) a nivel de bits también produce una diferencia simétrica. Las bases de datos de series temporales suelen utilizar la operación XOR como diferencia entre números de coma flotante, ya que produce diferencias fácilmente compresibles que consisten principalmente en bits cero. [ 1 ]
Otra variación consiste en cambiar la distancia entre los elementos utilizados para la operación delta: en lugar de calcularen la secuencia, un delta de "distancia-2" calcularíaEsto se observa en el filtro "delta" de xz . [ 3 ]
Código C de ejemplo
El siguiente código C realiza una forma sencilla de codificación y decodificación delta en una secuencia de caracteres:
void encode ( uint8_t buffer [], size_t length ) { uint8_t last = 0 ; for ( size_t i = 0 ; i < length ; ++ i ) { uint8_t current = buffer [ i ]; buffer [ i ] = current - last ; last = current ; } }void decode ( uint8_t buffer [], size_t length ) { uint8_t last = 0 ; for ( size_t i = 0 ; i < length ; ++ i ) { uint8_t delta = buffer [ i ]; buffer [ i ] = delta + last ; last = buffer [ i ]; } }Colecciones
Para la diferencia entre secuencias o conjuntos de valores (por ejemplo, cadenas de caracteres e imágenes), se puede definir un delta de dos maneras: delta simétrico y delta dirigido . Un delta simétrico entre dos conjuntos incluye suficiente información para que sea reversible:
La diferencia entre dos secuencias se define de forma análoga, excepto que se añade información para localizar las adiciones y eliminaciones. En las implementaciones informáticas, se ejemplifica con la salida de diff (en los modos predeterminado, unificado y de contexto): instrucciones en forma de "en la posición, reemplazar (contenido antiguo) con (contenido nuevo)".
Un delta dirigido , también llamado cambio, es una secuencia de operaciones de cambio (elementales) que, cuando se aplican a, produce otro,(nótese la correspondencia con los registros de transacciones en las bases de datos). En las implementaciones informáticas, suelen adoptar la forma de un lenguaje con dos comandos: copiar datos dey escribir datos literales . Un ejemplo es la salida de diff en el modo de edición de script .
Variantes
Una variante de la codificación delta que codifica las diferencias entre los prefijos o sufijos de las cadenas se denomina codificación incremental . Es particularmente eficaz para listas ordenadas con pequeñas diferencias entre las cadenas, como una lista de palabras de un diccionario .
Problemas de implementación
La naturaleza de los datos que se van a codificar influye en la eficacia de un algoritmo de compresión determinado.
La codificación delta funciona mejor cuando los datos tienen una variación pequeña o constante; para un conjunto de datos sin ordenar, es posible que este método no ofrezca prácticamente ninguna compresión.
En la transmisión con codificación delta a través de una red donde solo hay una copia del archivo disponible en cada extremo del canal de comunicación, se utilizan códigos de control de errores especiales para detectar qué partes del archivo han cambiado desde su versión anterior. Por ejemplo, rsync utiliza un algoritmo de suma de verificación rotativa basado en la suma de verificación adler-32 de Mark Adler .
Ejemplos
Compresión delta binaria
Una actualización delta es una actualización de software que requiere que el usuario descargue solo las partes del código que son nuevas o que han cambiado con respecto a su estado anterior, en lugar de tener que descargar el programa completo . El uso de actualizaciones delta puede ahorrar una cantidad significativa de tiempo y ancho de banda de procesamiento . El nombre "delta" deriva del uso en matemáticas de la letra griega delta, Δ o δ, para denotar cambio. [ 4 ]
Otro nombre para la tecnología subyacente es compresión delta binaria. En cualquier caso, la combinación de la versión anterior y el delta descargado se utiliza para reconstruir la nueva versión. Para obtener información sobre la tecnología utilizada para generar las diferencias, consulte la sección sobre diferenciación de datos .
Codificación delta en HTTP
Otro ejemplo del uso de la codificación delta es el RFC 3229 , "Codificación delta en HTTP", que propone que los servidores HTTP deberían poder enviar páginas web actualizadas en forma de diferencias entre versiones (deltas), lo que debería disminuir el tráfico de Internet, ya que la mayoría de las páginas cambian lentamente con el tiempo, en lugar de ser reescritas por completo repetidamente:
Este documento describe cómo se puede admitir la codificación delta como una extensión compatible con HTTP/1.1.
Muchas solicitudes HTTP (Protocolo de Transferencia de Hipertexto) provocan la recuperación de instancias ligeramente modificadas de recursos para los que el cliente ya tiene una entrada en caché. Las investigaciones han demostrado que estas actualizaciones modificatorias son frecuentes y que las modificaciones suelen ser mucho menores que la entidad original. En estos casos, HTTP haría un uso más eficiente del ancho de banda de la red si pudiera transferir una descripción mínima de los cambios, en lugar de la nueva instancia completa del recurso.
[...] Creemos que podría ser posible admitir rsync utilizando el marco de "manipulación de instancias" que se describe más adelante en este documento, pero esto no se ha desarrollado en detalle.
El marco sugerido basado en rsync se implementó en el sistema rproxy como un par de proxies HTTP. [ 5 ] Al igual que la implementación básica basada en vcdiff, ambos sistemas se utilizan con poca frecuencia.
Copia delta
La copia delta es una forma rápida de copiar un archivo parcialmente modificado, cuando existe una versión anterior en la ubicación de destino. Con la copia delta, solo se copia la parte modificada del archivo. Se suele utilizar en software de copia de seguridad o de copia de archivos , a menudo para ahorrar ancho de banda al copiar entre ordenadores a través de una red privada o internet. Un ejemplo notable de código abierto es rsync . [ 6 ] [ 7 ] [ 8 ]
Copia de seguridad en línea
Muchos servicios de copia de seguridad en línea adoptan esta metodología, conocida simplemente como deltas , para ofrecer a sus usuarios versiones anteriores del mismo archivo procedentes de copias de seguridad previas. Esto reduce los costes asociados, no solo en la cantidad de datos que deben almacenarse como versiones diferentes (ya que cada versión modificada de un archivo debe estar disponible para que los usuarios accedan a ella), sino también los costes de carga (y a veces de descarga) de cada archivo actualizado (al utilizarse únicamente el delta, en lugar del archivo completo).
Actualizaciones de Delta
En el caso de paquetes de software grandes, normalmente hay pocos cambios de datos entre versiones. Muchos proveedores optan por utilizar transferencias delta para ahorrar tiempo y ancho de banda.
Diferencia
Diff es un programa de comparación de archivos, utilizado principalmente para archivos de texto. Por defecto, genera diferencias simétricas reversibles. Dos formatos utilizados para parches de software , context y unified , proporcionan líneas de contexto adicionales que permiten tolerar cambios en el número de línea.
Git
El sistema de control de código fuente Git emplea compresión delta en una operación auxiliar llamada " git repack ". Los objetos del repositorio que aún no se han comprimido delta ("objetos sueltos") se comparan con un subconjunto heurísticamente seleccionado de todos los demás objetos, y los datos comunes y las diferencias se concatenan en un "archivo pack", que luego se comprime mediante métodos convencionales. En casos de uso comunes, donde los archivos fuente o de datos se modifican incrementalmente entre confirmaciones, esto puede generar un ahorro de espacio significativo. La operación repack se realiza normalmente como parte del proceso "git gc" [ 9 ] , que se activa automáticamente cuando la cantidad de objetos sueltos o archivos pack supera los umbrales configurados.
El formato está documentado en la página pack-format de la documentación de Git. Implementa un delta dirigido. [ 10 ]
VCDIFF
Un formato general para la codificación delta dirigida es VCDIFF, descrito en el RFC 3284. Entre las implementaciones de software libre se incluyen Xdelta y open-vcdiff.
GDIFF
El formato de diferencia genérica (GDIFF) es otro formato de codificación delta dirigida. Fue presentado al W3C en 1997. [ 11 ] En muchos casos, VCDIFF tiene una mejor tasa de compresión que GDIFF.
bsdiff
Bsdiff es un programa de comparación binaria que utiliza ordenación por sufijo . Para ejecutables que contienen muchos cambios en las direcciones de puntero, ofrece un mejor rendimiento que las codificaciones de tipo VCDIFF de "copia y literal". El objetivo es generar una pequeña comparación sin necesidad de analizar el código ensamblador (como en Courgette de Google). Bsdiff lo consigue permitiendo coincidencias de "copia" con errores, que luego se corrigen mediante una matriz adicional de "adición" de diferencias byte a byte. Dado que esta matriz contiene principalmente valores cero o repetidos para los cambios de desplazamiento, ocupa poco espacio después de la compresión. [ 12 ]
Bsdiff es útil para actualizaciones delta. Google usa bsdiff en Chromium y Android. La función deltarpm del gestor de paquetes RPM se basa en una versión muy modificada de bsdiff que puede usar una tabla hash para la coincidencia. [ 13 ] FreeBSD también usa bsdiff para actualizaciones. [ 14 ]
Desde el lanzamiento de bsdiff 4.3 en 2005, se han producido varias mejoras o correcciones para él. Google mantiene múltiples versiones del código para cada uno de sus productos. [ 15 ] FreeBSD toma muchos de los cambios compatibles de Google, principalmente una corrección de vulnerabilidad y un cambio a la divsufsortrutina de ordenación de sufijos más rápida. [ 16 ] Debian tiene una serie de ajustes de rendimiento para el programa. [ 17 ]
ddelta es una reescritura de bsdiff propuesta para su uso en las actualizaciones delta de Debian. Entre otras mejoras de eficiencia, utiliza una ventana deslizante para reducir el costo de memoria y CPU. [ 18 ]
Véase también
- Diferenciación de datos : método para comprimir los cambios a lo largo del tiempo.
- deltas intercalados
- Sistema de control de versiones de código fuente : sistema de control de versiones para código fuente.
- Problema de corrección de cadena a cadena
- Xdelta : codificador delta de código abierto
Referencias
- 1 2 "Algoritmos de compresión de series temporales, explicados" . Blog de Tiger Data . 22 de abril de 2020.
- ↑ Hatanaka, Yuki (2008). "Un formato de compresión y herramientas para datos de observación GNSS" (PDF) . Boletín del Instituto de Estudios Geográficos . 55 : 21–30 . Recuperado el 25 de septiembre de 2020 .
- ↑ – Shell and Utilities Reference, The Single UNIX Specification , Versión 5 de The Open Group "--delta[=options] ... Opciones admitidas: dist=distance Especifica la distancia del cálculo delta en bytes. La distancia debe ser de 1 a 256.
- ↑ Mullin, Sean (25 de abril de 2017). "¿Qué es Delta en matemáticas?" . Sciencing . Leaf Group Media . Consultado el 6 de septiembre de 2022.
Delta... significa 'cambio' o 'el cambio en' en matemáticas.
- ↑ "rproxy: introducción" . rproxy.samba.org .
- ↑ "Solicitud de función: Copia delta - 2BrightSparks" . Archivado del original el 13 de marzo de 2016. Consultado el 29 de abril de 2016 .
- ↑ "Copia de seguridad 2 | Foro | Cómo funciona la copia delta" .
- ↑
- ↑ "Git - git-gc Documentation" . git-scm.com . Consultado el 9 de noviembre de 2024 .
- ↑ "Documentación de Git - pack-format" . Documentación de Git . Consultado el 13 de enero de 2020 .
- ↑ "Especificación de formato Diff genérico" . www.w3.org .
- ↑ "Diferencia binaria" . www.daemonology.net . Consultado el 9 de noviembre de 2024 .
- ↑ "rpmdelta/delta.c" . rpm-software-management. 3 de julio de 2019. Consultado el 13 de enero de 2020 .
- ↑ Anónimo (mayo de 2016). "ATAQUES NO CRIPTANALÍTICOS CONTRA COMPONENTES DE ACTUALIZACIÓN DE FREEBSD" . GitHub Gist .
- ↑ "xtraeme/bsdiff-chromium: README.chromium" . GitHub . 2012.; "courgette/third_party/bsdiff/README.chromium - chromium/src" . Git en Google .; "android/platform/external/bsdiff/" . Git en Google .
- ↑ "Historial de freebsd/usr.bin/bsdiff" . GitHub .
- ↑ "Paquete: bsdiff" . Rastreador de parches de Debian .
- ^ Klode, Julián. "julian-klode/ddelta" . GitHub . Consultado el 13 de enero de 2020 .
Enlaces externos
- RFC 3229 – Codificación Delta en HTTP
- Algoritmos de compresión sin pérdidas
- Diferenciación de datos
- Compresión de datos