sql >> Base de Datos >  >> NoSQL >> Redis

La decodificación Go JSON es muy lenta. ¿Cuál sería una mejor manera de hacerlo?

El análisis de grandes datos JSON parece ser más lento de lo que debería ser. Valdría la pena identificar la causa y enviar un parche a los autores de Go.

Mientras tanto, si puede evitar JSON y usar un formato binario, no solo evitará este problema; también ganará el tiempo que su código ahora dedica a analizar representaciones decimales ASCII de números en sus equivalentes binarios IEEE 754 (y posiblemente introduzca errores de redondeo al hacerlo).

Si tanto el remitente como el destinatario están escritos en Go, sugiero usar el formato binario de Go:gob .

Haciendo una prueba rápida, generando un mapa con 2000 entradas, cada una de ellas un segmento con 1050 flotantes simples, me da 20 MB de JSON, que tarda 1,16 segundos en analizarse en mi máquina.

Para estos puntos de referencia rápidos, tomo lo mejor de tres ejecuciones, pero me aseguro de medir solo el tiempo de análisis real, con t0 := time.Now() antes de la llamada Unmarshal e imprimiendo time.Now().Sub(t0) después de eso.

Usando GOB, el mismo mapa da como resultado 18 MB de datos, lo que toma 115 ms para analizar:
una décima parte del tiempo .

Sus resultados variarán dependiendo de cuántos flotadores reales tenga allí. Si sus flotantes tienen muchos dígitos significativos, que merecen su representación de float64, entonces 20 MB de JSON contendrán mucho menos que mis dos millones de flotantes. En ese caso, la diferencia entre JSON y GOB será cada vez más marcada.

Por cierto, esto demuestra que el problema radica en el analizador JSON, no en la cantidad de datos para analizar, ni en las estructuras de memoria para crear (porque ambas pruebas están analizando ~ 20 MB de datos y recreando las mismas porciones de flotantes). Reemplazar todos los flotantes con cadenas en el JSON me da un tiempo de análisis de 1,02 segundos, lo que confirma que la conversión de la representación de cadenas a flotantes binarios toma cierto tiempo (en comparación con solo mover bytes), pero no es el principal culpable.

Si el remitente y el analizador no son ambos Go, o si desea exprimir el rendimiento aún más que GOB, debe usar su propio formato binario personalizado, ya sea usando Protocol Buffers o manualmente con "codificación/binario" y amigos.