首頁 > 後端開發 > Golang > 如何在不載入到記憶體的情況下有效率地以 JSON 形式編組大型資料流?

如何在不載入到記憶體的情況下有效率地以 JSON 形式編組大型資料流?

Mary-Kate Olsen
發布: 2024-10-29 04:51:29
原創
985 人瀏覽過

How to Efficiently Marshal Large Data Streams in JSON without Loading into Memory?

以JSON 形式編組大數據流而不加載到內存中

經常需要將大數據流編碼為JSON,但加載整個資料流立即流入記憶體可能是不切實際的。本文探討了在不使用內建 json.Marshaler 介面的情況下克服這項挑戰的方法。

使用json.Encoder 編碼:限制

嘗試對大型流進行編碼使用json.Encoder 處理資料將會失敗,因為它無法處理記憶體中的通道(chan 字串)。

自訂 JSON 編碼

在沒有合適的建置的情況下- 在解決方案中,自訂 JSON 編碼變得必要。這涉及手動建立JSON 字串,如下面的程式碼片段所示:

w := os.Stdout
w.WriteString(`{ "Foo": "` + t.Foo + `", "Bar": [`)

for x := range t.Bar {
    _ = json.NewEncoder(w).Encode(x)
    w.WriteString(`,`)
}

w.WriteString(`]}`)
登入後複製

擴充encoding/json以支援通道

增強encoding/json套件有了通道支持,您可以修改encoding/json/encode.go中的reflectValueQuoted函數。具體來說,為通道添加類似於以下內容的案例:

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(']')
登入後複製

結論

雖然encoding/json套件目前不支援通道編碼,但本文提供了有效地以JSON 形式編組大型資料流的替代方法。自訂編碼允許將資料直接串流傳輸到 JSON 輸出,而擴充encoding/json 則提供更強大的解決方案。

以上是如何在不載入到記憶體的情況下有效率地以 JSON 形式編組大型資料流?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板