Redis
 sql >> Baza danych >  >> NoSQL >> Redis

Dekodowanie Go JSON jest bardzo powolne. Jaki byłby lepszy sposób na zrobienie tego?

Analizowanie dużych danych JSON wydaje się być wolniejsze niż powinno. Warto byłoby wskazać przyczynę i przesłać łatkę autorom Go.

W międzyczasie, jeśli możesz uniknąć JSON i użyć formatu binarnego, nie tylko unikniesz tego problemu; zyskasz również czas, który Twój kod spędza teraz na parsowaniu reprezentacji dziesiętnych liczb ASCII do ich binarnych odpowiedników IEEE 754 (i prawdopodobnie wprowadzając przy tym błędy zaokrąglania).

Jeśli zarówno nadawca, jak i odbiorca są napisane w Go, sugeruję użycie formatu binarnego Go:gob .

Wykonanie szybkiego testu, wygenerowanie mapy z 2000 wpisami, każdy wycinek z 1050 prostymi elementami zmiennoprzecinkowymi, daje mi 20 MB JSON, co zajmuje 1,16 sekundy na przeanalizowanie na moim komputerze.

W przypadku tych szybkich testów porównawczych wybieram najlepsze z trzech przebiegów, ale upewniam się, że mierzę tylko rzeczywisty czas parsowania za pomocą t0 := time.Now() przed wywołaniem Unmarshal i wydrukowaniem time.Now().Sub(t0) po nim.

Używając GOB, ta sama mapa daje 18 MB danych, których przeanalizowanie zajmuje 115 ms:
jedna dziesiąta razy .

Twoje wyniki będą się różnić w zależności od tego, ile rzeczywistych pływaków tam masz. Jeśli twoje liczby zmiennoprzecinkowe mają wiele cyfr znaczących, zasługujących na swoją reprezentację typu float64, to 20 MB JSON będzie zawierać znacznie mniej niż moje dwa miliony liczb zmiennoprzecinkowych. W takim przypadku różnica między JSON a GOB będzie coraz większa.

BTW, to dowodzi, że problem tkwi w parserze JSON, a nie w ilości danych do przeanalizowania, ani w strukturach pamięci do utworzenia (ponieważ oba testy parsują ~20 MB danych i odtwarzają te same wycinki pływaków). Zastąpienie wszystkich elementów zmiennoprzecinkowych ciągami w JSON daje mi czas parsowania wynoszący 1,02 s, potwierdzając, że konwersja z reprezentacji w postaci ciągu na elementy zmiennoprzecinkowe zajmuje pewien czas (w porównaniu do zwykłego przesuwania bajtów), ale nie jest głównym winowajcą.

Jeśli zarówno nadawca, jak i parser nie są w Go, lub jeśli chcesz zwiększyć wydajność jeszcze bardziej niż GOB, powinieneś użyć własnego, dostosowanego formatu binarnego, używając buforów protokołów lub ręcznie za pomocą "kodowania/binarnego" i znajomych.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Czy można połączyć się z Amazon ElastiСache Redis poza Amazonem?

  2. Jak skonfigurować sesje Spring do pracy z Redis w xml?

  3. limit czasu redis z predis

  4. Seler/Redis to samo zadanie wykonywane wiele razy równolegle

  5. Redis:Zwróć wszystkie wartości przechowywane w bazie danych