「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > メモリにロードせずに大規模なデータ ストリームを JSON で効率的にマーシャリングする方法

メモリにロードせずに大規模なデータ ストリームを JSON で効率的にマーシャリングする方法

2024 年 10 月 31 日公開
ブラウズ:863

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(`]}`)

チャネル サポートのエンコーディング/json の拡張

チャネル サポートでエンコーディング/json パッケージを拡張するには、reflectValueQuoted を変更できます。関数はencoding/json/encode.goにあります。具体的には、

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(']')

結論

現時点では、エンコーディング/json パッケージはチャネル エンコーディングをサポートしていませんが、この記事では、大規模なデータ ストリームをマーシャリングするための代替アプローチを提供します。 JSON で効率的に。カスタム エンコーディングを使用すると、データを JSON 出力に直接ストリーミングできますが、エンコーディング/json を拡張すると、より堅牢なソリューションが提供されます。

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3