Marshaling Strim Data Besar dalam JSON tanpa Memuatkan ke dalam Memori
Keperluan untuk mengekod aliran data yang besar ke dalam JSON sering timbul, tetapi memuatkan keseluruhan aliran ke dalam ingatan sekaligus boleh menjadi tidak praktikal. Artikel ini meneroka cara untuk mengatasi cabaran ini tanpa antara muka json.Marshaler terbina dalam.
Pengekodan dengan json.Encoder: A Limitation
Percubaan untuk mengekod aliran besar data dengan json.Encoder akan gagal kerana ketidakupayaannya untuk mengendalikan saluran (rentetan chan) dalam ingatan.
Pengekodan JSON Tersuai
Jika tiada binaan yang sesuai -dalam penyelesaian, pengekodan JSON tersuai menjadi perlu. Ini melibatkan membina rentetan JSON secara manual, seperti yang ditunjukkan dalam coretan di bawah:
w := os.Stdout w.WriteString(`{ "Foo": "` + t.Foo + `", "Bar": [`) for x := range t.Bar { _ = json.NewEncoder(w).Encode(x) w.WriteString(`,`) } w.WriteString(`]}`)
Melanjutkan pengekodan/json untuk Sokongan Saluran
Untuk mempertingkatkan pengekodan/pakej json dengan sokongan saluran, anda boleh mengubah suai fungsi reflectValueQuoted dalam pengekodan/json/encode.go. Khususnya, tambahkan kes untuk saluran yang serupa dengan yang berikut:
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(']')
Kesimpulan
Walaupun pakej pengekodan/json tidak menyokong pengekodan saluran pada masa ini, artikel ini menyediakan pendekatan alternatif untuk menyusun aliran data yang besar dalam JSON dengan cekap. Pengekodan tersuai membenarkan penstriman data terus ke dalam output JSON, sementara melanjutkan pengekodan/json menawarkan penyelesaian yang lebih mantap.
Atas ialah kandungan terperinci Bagaimana untuk Menstrim Data Besar Marshal dengan Cekap dalam JSON tanpa Memuatkan ke dalam Memori?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!