Redis
 sql >> Teknologi Basis Data >  >> NoSQL >> Redis

Go JSON decoding sangat lambat. Apa cara yang lebih baik untuk melakukannya?

Mengurai data JSON yang besar tampaknya lebih lambat dari yang seharusnya. Akan bermanfaat untuk menentukan penyebabnya dan mengirimkan tambalan ke penulis Go.

Sementara itu, jika Anda dapat menghindari JSON dan menggunakan format biner, Anda tidak hanya akan menghindari masalah ini; Anda juga akan mendapatkan waktu yang dihabiskan kode Anda sekarang untuk menguraikan representasi desimal ASCII dari angka ke dalam ekuivalen biner IEEE 754 (dan mungkin memperkenalkan kesalahan pembulatan saat melakukannya.)

Jika pengirim dan penerima Anda ditulis dalam Go, saya sarankan menggunakan format biner Go:gob .

Melakukan tes cepat, menghasilkan peta dengan 2000 entri, masing-masing irisan dengan 1050 float sederhana, memberi saya 20 MB JSON, yang membutuhkan waktu 1,16 detik untuk diuraikan di mesin saya.

Untuk tolok ukur cepat ini, saya mengambil yang terbaik dari tiga proses, tetapi saya memastikan untuk hanya mengukur waktu penguraian yang sebenarnya, dengan t0 := time.Now() sebelum panggilan Unmarshal dan mencetak time.Now().Sub(t0) setelah itu.

Dengan menggunakan GOB, peta yang sama menghasilkan data sebesar 18 MB, yang memerlukan waktu 115 mdtk untuk diuraikan:
sepersepuluh kali .

Hasil Anda akan bervariasi tergantung pada berapa banyak pelampung sebenarnya yang Anda miliki di sana. Jika float Anda memiliki banyak angka signifikan, yang layak mendapatkan representasi float64 mereka, maka 20 MB JSON akan berisi jauh lebih sedikit daripada dua juta float saya. Dalam hal ini, perbedaan antara JSON dan GOB akan semakin mencolok.

BTW, ini membuktikan bahwa masalahnya memang terletak pada parser JSON, bukan pada jumlah data yang akan diurai, atau pada struktur memori yang akan dibuat (karena kedua pengujian mem-parsing ~ 20 MB data dan membuat ulang irisan float yang sama.) Mengganti semua float dengan string di JSON memberi saya waktu parsing 1,02 detik, mengonfirmasi bahwa konversi dari representasi string ke float biner memang membutuhkan waktu tertentu (dibandingkan dengan hanya memindahkan byte) tetapi bukan penyebab utama.

Jika pengirim dan pengurai keduanya bukan Go, atau jika Anda ingin memeras kinerja lebih jauh dari GOB, Anda harus menggunakan format biner khusus Anda sendiri, baik menggunakan Protocol Buffers atau secara manual dengan "encoding/binary" dan teman-teman.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. ZRANGESTORE sebelum Redis 6.2.0

  2. Bagaimana Menerapkan Transaksi Terdistribusi Di Mysql, Redis, dan Mongo

  3. Bagaimana cara mengkonfigurasi JedisConnectionFactory untuk menggunakan SSL sehingga saya tidak mendapatkan kesalahan:JedisDataException:ERR koneksi tidak terenkripsi dilarang?

  4. Tidak bisa mendapatkan koneksi Jedis; Tidak bisa mendapatkan sumber daya dari kumpulan

  5. redis:setel ulang penghitung setiap hari