Crear tu propio formato binario: más fácil de lo que parece
Packing Binary Is Fun
Un desarrollador se propone crear un formato binario para reducir payloads JSON. Lo que empieza como un simple fwrite se convierte en un lenguaje de esquemas completo, jBin, que logra comprimir datos hasta un 80%. El artículo explica desde la representación ASCII hasta el empaquetado de tipos y longitudes en un solo varint, pasando por la necesidad de esquemas para evitar repetir metadatos.
“¿Qué tan difícil puede ser hacer mi propio formato binario?”
- trashb
Echo de menos algunas partes importantes que yo diría que cualquier formato (binario) necesita.
- una cabecera mágica
- un número de versión
- un crc o comprobación de corrupción de datos
Además, diría que en este caso sería mejor escribir un parser de texto personalizado en lugar de parsear un formato binario; esto es similar al debate entre configuración estilo Unix y el regedit de Windows. Preferiría algo que no sea json pero que siga siendo legible como txt.
Incluso el ejemplo json que se proporciona al final se puede minificar de 418 caracteres a 166 reemplazando los nombres de los campos por caracteres individuales y eliminando los espacios. Casi todo el ahorro en este formato proviene de no incluir los nombres de los campos y tener un diseño dependiente de la posición. Puedes optar por tener delimitadores o hacer que un byte indique el tipo (+tamaño); por ejemplo, la siguiente cadena codifica los datos del ejemplo casi (85 bytes vs 80 bytes) con la misma eficiencia pero sigue siendo legible y admite interpretación utf-8.
123456789;LeroyJenkins;60;alliance;p,100,200,300;i,999,1,1;i,45,100,0;a,s,120;a,a,45;
Puedes optimizarlo aún más permitiendo entradas recurrentes y permitiendo valores asumidos a partir de un valor predeterminado definido, y enviar solo los deltas puede depender del tipo de datos que esperas.
{ "itemId": 999, "quantity": 1, "isSoulbound": false }
i,999,1,0
podría convertirse en:
default = { "itemId": 0, "quantity": 1, "isSoulbound": false }
{ "itemId": 999}
i,999
- ErikHuisman
Yo también quiero ser un desarrollador de verdad, así que simplemente le hago GZIP al JSON para convertirlo en binario.
- Skwid
Una de mis aventuras favoritas de perder el tiempo en un trabajo anterior fue escribir un decodificador UBJSON que parsea in situ ~1MB de datos en un dispositivo con más o menos la misma memoria libre. Acceso rápido (lo suficiente) por clave, búsqueda binaria con algunos atajos para el payload mayormente numérico.
Construía un índice de quizás 30 bytes para acelerar las cosas, pero también para permitirle seguir trabajando en la cola del mensaje antiguo mientras el nuevo sobrescribía su inicio.
¿Debería el diseño del sistema haber requerido todo esto de un dispositivo con 4MB de memoria? Probablemente no. Pero funcionó, y me lo pasé genial.