使用MarshalJSON 編碼大數據流而不載入記憶體中的所有物件
想要使用json.Encoder 編碼大資料流而不加載一次將所有內容全部存入內存是一個常見問題。不幸的是,encoding/json 套件不提供對此的直接支援。
目前解決方法
正如您所提到的,目前的解決方案是手動建立 JSON 字串你自己。這涉及到當資料從流中可用時,逐段編寫 JSON 結構。這是一種有效的方法,但可能很乏味且容易出錯。
建議的補丁
要改進此過程,可以修改encoding/json 套件。具體來說,可以修改encoding/json/encode.go 中的reflectValueQuoted 函數來處理陣列等通道。這將使資料從通道直接串流傳輸到 JSON 輸出。
以下是對ReflectValueQuoted 中數組情況的建議更改:
<code class="go">case reflect.Array: e.WriteByte('[') n := v.Len() for i := 0; i < n; i++ { if i > 0 { e.WriteByte(',') } e.reflectValue(v.Index(i)) } e.WriteByte(']') // Add the following case for channels: 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(']')</code>
補丁的好處
此補丁將使對大數據流進行好處
此補丁將使對大數據流進行好處編碼變得更加容易,而無需將所有物件載入到記憶體中。它還將消除手動字串連接的需要,降低錯誤風險並提高程式碼可讀性。
結論
儘管建議的補丁不是當前補丁的一部分coding/json 包,它展示了一種潛在的改進,可以使流式JSON 數據更加高效和方便。以上是我們如何將大數據串流為 JSON,而不將所有物件載入到記憶體中?的詳細內容。更多資訊請關注PHP中文網其他相關文章!