sql >> Database teknologi >  >> NoSQL >> Redis

Go JSON-afkodning er meget langsom. Hvad ville være en bedre måde at gøre det på?

Parsing af store JSON-data ser ud til at være langsommere, end det burde være. Det ville være umagen værd at udpege årsagen og indsende en patch til Go-forfatterne.

I mellemtiden, hvis du kan undgå JSON og bruge et binært format, vil du ikke kun undgå dette problem; du vil også vinde den tid, din kode nu bruger på at parse ASCII-decimalrepræsentationer af tal til deres binære IEEE 754-ækvivalenter (og muligvis introducere afrundingsfejl, mens du gør det.)

Hvis både din afsender og modtager er skrevet i Go, foreslår jeg, at du bruger Go's binære format:gob .

At lave en hurtig test, generere et kort med 2000 poster, hver en skive med 1050 simple floats, giver mig 20 MB JSON, hvilket tager 1,16 sek. at parse på min maskine.

For disse hurtige benchmarks tager jeg det bedste af tre kørsler, men jeg sørger for kun at måle den faktiske parsingtid med t0 := time.Now() før Unmarshal-kaldet og udskrivning af time.Now().Sub(t0) efter det.

Ved at bruge GOB resulterer det samme kort i 18 MB data, hvilket tager 115 ms at parse:
en tiendedel af gangen .

Dine resultater vil variere afhængigt af, hvor mange faktiske flydere du har der. Hvis dine flydere har mange væsentlige cifre, som fortjener deres float64-repræsentation, så vil 20 MB JSON indeholde meget færre end mine to millioner flydere. I så fald vil forskellen mellem JSON og GOB blive stadig større.

BTW, dette beviser, at problemet faktisk ligger i JSON-parseren, ikke i mængden af ​​data, der skal parses, eller i hukommelsesstrukturerne, der skal oprettes (fordi begge test analyserer ~ 20 MB data og genskaber de samme skiver af flydende). Udskiftning af alle floats med strenge i JSON giver mig en parsingtid på 1,02 sek., hvilket bekræfter, at konverteringen fra strengrepræsentation til binære floats tager en vis tid (sammenlignet med blot at flytte bytes rundt), men ikke er hovedsynderen.

Hvis afsenderen og parseren ikke begge er Go, eller hvis du vil presse ydeevnen endnu længere end GOB, bør du bruge dit eget tilpassede binære format, enten ved hjælp af protokolbuffere eller manuelt med "encoding/binary" og venner.



  1. Abonner på Meteor.Users Collection

  2. Redis py:hvornår skal man bruge forbindelsespool?

  3. Hvordan kan jeg køre redis på en enkelt server på forskellige porte?

  4. Redis forslag til valg af datatype