Bagaimanakah Kami Boleh Mengekodkan Strim Data Besar dalam JSON Tanpa Memuatkan Objek dalam Memori?

Susan Sarandon
Lepaskan: 2024-10-28 04:08:30
asal
222 orang telah melayarinya

 How Can We Encode Large Data Streams in JSON Without Loading Objects in Memory?

Pengekodan Strim Data Besar dalam JSON tanpa Pemuatan Objek Dalam Memori

Dalam senario yang melibatkan aliran data yang luas, json pakej mungkin menghadapi had apabila cuba mengekod semua objek secara serentak ke dalam ingatan. Pertimbangkan senario ini:

<code class="go">type T struct {
    Foo string

    // Bar represents a large stream of objects
    // that we don't want to load entirely into memory.
    Bar chan string
}</code>
Salin selepas log masuk

Semasa cuba mengawal menggunakan json.Encoder, ralat berlaku disebabkan rentetan chan jenis yang tidak disokong.

<code class="go">if err := json.NewEncoder(os.Stdout).Encode(&t); err != nil {
    log.Fatal(err)
}</code>
Salin selepas log masuk

Dalam situasi seperti ini, membina secara manual rentetan JSON menjadi perlu. Walau bagaimanapun, mekanisme yang lebih cekap adalah wajar.

Jika antara muka json.Marshaler menyerupai struktur ini, proses pengekodan akan menjadi lebih mudah:

<code class="go">type Marshaler interface {
    MarshalJSON(io.Writer) error
}</code>
Salin selepas log masuk

Malangnya, pakej pengekodan/json pada masa ini tidak mempunyai mekanisme sedemikian. Oleh itu, menyesuaikan pakej terbina dalam mungkin perlu. Untuk mencapai matlamat ini, pengubahsuaian pada fungsi reflectValueQuoted dalam pengekodan/json/encode.go diperlukan. Khususnya, tumpuan harus diletakkan pada kotak Array (dengan fallthrough ke Slice) dan penambahan case untuk saluran.

<code class="go">// Case Array:
e.WriteByte('[')
n := v.Len()
for i := 0; i < n; i++ {
    if i > 0 {
        e.WriteByte(',')
    }
    e.reflectValue(v.Index(i))
}
e.WriteByte(']')

// Case Chan:
e.WriteByte('[')
i := 0
for {
    x, ok := v.Recv()
    if !ok {
        break
    }
    if i > 0 {
        e.WriteByte(',')
    }
    e.reflectValue(x)
    i++
}
e.WriteByte(']')</code>
Salin selepas log masuk

Nota: Kotak saluran mungkin memerlukan pemeriksaan tambahan yang tidak jelas dalam kod di atas.

Dengan melaksanakan pengubahsuaian ini, saluran akan dianggap sama dengan tatasusunan dalam proses pengekodan. Pengubahsuaian ini boleh diserahkan sebagai tampung pada pakej pengekodan/json untuk kemungkinan dimasukkan.

Atas ialah kandungan terperinci Bagaimanakah Kami Boleh Mengekodkan Strim Data Besar dalam JSON Tanpa Memuatkan Objek dalam Memori?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!