Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah anda boleh mengekod aliran data yang besar ke dalam JSON tanpa ketepuan memori?
Apabila bekerja dengan set data besar yang memerlukan pengekodan ke dalam format JSON, tingkah laku lalai pakej json boleh menjadi tidak cekap. Ia memerlukan memuatkan keseluruhan set data ke dalam ingatan sebelum pengekodan, yang boleh menyebabkan isu prestasi.
Untuk menangani pengehadan ini, pertimbangkan senario di mana kita mempunyai struct t dengan medan Foo dan Bar saluran yang menstrim objek. Kami mahu mengekod t ke dalam JSON tanpa menyimpan keseluruhan kandungan Bar dalam memori.
Pada masa ini, pakej json tidak mempunyai sokongan untuk pengekodan penstriman. Penyelesaian adalah dengan membina rentetan JSON secara manual dengan menulis kepada aliran bait. Ini boleh dilakukan seperti berikut:
w := os.Stdout w.WriteString(`{ "Foo": "` + t.Foo + `", "Bar": [`) for x := range t.Bar { _ = json.NewEncoder(w).Encode(x) w.WriteString(`,`) } w.WriteString(`]}`)
Pakej pengekodan/json yang dipertingkatkan akan termasuk antara muka Marshaler yang disemak semula yang membenarkan pengekodan penstriman. Ini akan kelihatan seperti:
type Marshaler interface { MarshalJSON(io.Writer) error }
Jika pakej pengekodan/json tidak memenuhi keperluan anda, anda boleh mempertimbangkan untuk menampalnya. Berikut ialah pengubahsuaian yang mungkin untuk mengendalikan saluran penstriman:
case reflect.Chan: e.WriteByte('[') i := 0 for { x, ok := v.Recv() if !ok { break } if i > 0 { e.WriteByte(',') } e.reflectValue(x) i++ } e.WriteByte(']')
Ingat bahawa menampal pustaka standard harus dilakukan dengan berhati-hati dan boleh menimbulkan isu keserasian.
Atas ialah kandungan terperinci Bagaimanakah anda boleh mengekod aliran data yang besar ke dalam JSON tanpa ketepuan memori?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!