」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 如何在不載入到記憶體的情況下有效率地以 JSON 形式編組大型資料流?

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

發佈於2024-10-31
瀏覽:487

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以支持通道

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包的通道支持,可以修改reflectValueQuoted函數位於encoding /json/encode.go中。具體來說,為通道添加類似於以下內容的案例:

casereflect.Chan: e.WriteByte('[') 我:= 0 為了 { x, 好的 := v.Recv() 如果!好的{ 休息 } 如果我 > 0 { e.WriteByte(',') } e.reflectValue(x) 我 } e.WriteByte(']')

結論

How to Efficiently Marshal Large Data Streams in JSON without Loading into Memory? 
雖然encoding/json套件目前不支援通道編碼,但本文提供了編組大型資料流的替代方法高效地使用JSON 格式。自訂編碼允許將資料直接串流傳輸到 JSON 輸出,而擴充encoding/json 則提供更強大的解決方案。

最新教學 更多>

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3