Redis
 sql >> Base de données >  >> NoSQL >> Redis

Le décodage Go JSON est très lent. Quelle serait une meilleure façon de le faire?

L'analyse de données JSON volumineuses semble être plus lente qu'elle ne devrait l'être. Il serait intéressant d'en identifier la cause et de soumettre un correctif aux auteurs de Go.

En attendant, si vous pouvez éviter JSON et utiliser un format binaire, vous éviterez non seulement ce problème; vous gagnerez également le temps que votre code passe maintenant à analyser les représentations décimales ASCII des nombres dans leurs équivalents binaires IEEE 754 (et éventuellement à introduire des erreurs d'arrondi en le faisant.)

Si votre expéditeur et votre destinataire sont écrits en Go, je vous suggère d'utiliser le format binaire de Go :gob .

Faire un test rapide, générer une carte avec 2000 entrées, chacune une tranche avec 1050 flottants simples, me donne 20 Mo de JSON, ce qui prend 1,16 seconde à analyser sur ma machine.

Pour ces repères rapides, je prends le meilleur des trois essais, mais je m'assure de ne mesurer que le temps d'analyse réel, avec t0 := time.Now() avant l'appel Unmarshal et l'affichage de time.Now().Sub(t0) après.

En utilisant GOB, la même carte génère 18 Mo de données, ce qui prend 115 ms à analyser :
un dixième du temps .

Vos résultats varieront en fonction du nombre de flotteurs réels que vous avez là-bas. Si vos flottants ont beaucoup de chiffres significatifs, méritant leur représentation float64, alors 20 Mo de JSON contiendront beaucoup moins que mes deux millions de flottants. Dans ce cas, la différence entre JSON et GOB sera encore plus frappante.

BTW, cela prouve que le problème réside bien dans l'analyseur JSON, pas dans la quantité de données à analyser, ni dans les structures de mémoire à créer (car les deux tests analysent ~ 20 Mo de données et recréent les mêmes tranches de flottants.) Le remplacement de tous les flottants par des chaînes dans le JSON me donne un temps d'analyse de 1,02 seconde, ce qui confirme que la conversion de la représentation sous forme de chaîne en flottants binaires prend un certain temps (par rapport au simple déplacement d'octets) mais n'est pas le principal coupable.

Si l'expéditeur et l'analyseur ne sont pas tous les deux Go, ou si vous souhaitez optimiser les performances encore plus que GOB, vous devez utiliser votre propre format binaire personnalisé, soit en utilisant Protocol Buffers, soit manuellement avec "encoding/binary" et ses amis.