以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中文網其他相關文章!