sql >> Databasteknik >  >> NoSQL >> Redis

Go JSON-avkodning är mycket långsam. Vad skulle vara ett bättre sätt att göra det?

Att analysera stora JSON-data verkar vara långsammare än det borde vara. Det skulle vara värt att peka ut orsaken och skicka in en patch till Go-författarna.

Under tiden, om du kan undvika JSON och använda ett binärt format, kommer du inte bara att undvika det här problemet; du kommer också att vinna den tid som din kod nu ägnar åt att analysera ASCII-decimalrepresentationer av tal till deras binära IEEE 754-ekvivalenter (och eventuellt införa avrundningsfel samtidigt som du gör det.)

Om både din avsändare och mottagare är skrivna i Go föreslår jag att du använder Gos binära format:gob .

Att göra ett snabbtest, generera en karta med 2000 poster, var och en en skiva med 1050 enkla flytningar, ger mig 20 MB JSON, vilket tar 1,16 sek att analysera på min maskin.

För dessa snabba benchmarks tar jag det bästa av tre körningar, men jag ser till att bara mäta den faktiska analystiden, med t0 := time.Now() före Unmarshal-anropet och utskrift av time.Now().Sub(t0) efter det.

Med GOB resulterar samma karta i 18 MB data, vilket tar 115 ms att analysera:
en tiondel av tiden .

Dina resultat kommer att variera beroende på hur många faktiska flöten du har där. Om dina flöten har många signifikanta siffror, som förtjänar deras float64-representation, kommer 20 MB JSON att innehålla mycket färre än mina två miljoner float. I så fall kommer skillnaden mellan JSON och GOB att bli allt större.

BTW, detta bevisar att problemet verkligen ligger i JSON-parsern, inte i mängden data som ska analyseras, inte heller i minnesstrukturerna som ska skapas (eftersom båda testerna analyserar ~ 20 MB data och återskapar samma skivor av flytningar.) Att ersätta alla flöten med strängar i JSON ger mig en analystid på 1,02 sek, vilket bekräftar att konverteringen från strängrepresentation till binära flöten tar en viss tid (jämfört med att bara flytta runt byte) men inte är huvudboven.

Om avsändaren och parsern inte båda är Go, eller om du vill pressa prestandan ännu längre än GOB, bör du använda ditt eget anpassade binära format, antingen med Protocol Buffers eller manuellt med "encoding/binary" och vänner.



  1. Kan jag ställa in global TTL i redis?

  2. MongoDB E11000 dubblettnyckelfel

  3. Ansluter du till mongodb via webbläsaren?

  4. Tips för att lagra MongoDB-säkerhetskopior i molnet