ホームページ >バックエンド開発 >Golang >Go で大規模なストリーミング JSON データを効率的にデコードするにはどうすればよいですか?

Go で大規模なストリーミング JSON データを効率的にデコードするにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-18 22:49:10265ブラウズ

How Can I Efficiently Decode Large Streaming JSON Data in Go?

大規模なストリーム JSON を効率的にデコードする

膨大な JSON 配列を一度にデコードすると、メモリの問題が発生する可能性があります。これに対処するには、要素を 1 つずつ反復処理するストリーミング アプローチを採用することをお勧めします。

要素ごとに JSON 要素をストリーミング

エンコーディング/json パッケージは次のことを行います。 JSON データをストリーミングするためのメソッド。以下に例を示します。

import (
    "encoding/json"
    "fmt"
    "log"
    "strings"
)

func main() {
    const jsonStream = `
        [
            {"Name": "Ed", "Text": "Knock knock."},
            {"Name": "Sam", "Text": "Who's there?"},
            {"Name": "Ed", "Text": "Go fmt."},
            {"Name": "Sam", "Text": "Go fmt who?"},
            {"Name": "Ed", "Text": "Go fmt yourself!"}
        ]`
    dec := json.NewDecoder(strings.NewReader(jsonStream))

    // skip the opening bracket
    dec.Token()

    // read and process each element
    for dec.More() {
        var message Message
        if err := dec.Decode(&message); err != nil {
            log.Fatal(err)
        }
        fmt.Printf("%v: %v\n", message.Name, message.Text)
    }

    // skip the closing bracket
    dec.Token()
}

このコードでは、json.NewDecoder を使用して JSON ストリームのデコーダーを作成します。次に、ストリームを反復処理し、開始括弧と終了括弧 ({ と }) をスキップし、dec.More() を使用して、さらに処理する要素があるかどうかを確認します。

要素ごとに、Message 構造体を作成します。そして、dec.Decode を使用して JSON データをデコードします。次に、メッセージの名前フィールドとテキスト フィールドを出力します。

このアプローチにより、配列全体をメモリにロードせずに大きな JSON 配列を処理できるため、メモリ不足エラーが回避され、パフォーマンスが向上します。

以上がGo で大規模なストリーミング JSON データを効率的にデコードするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。