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

Mary-Kate Olsen
リリース: 2024-10-29 04:51:29
オリジナル
888 人が閲覧しました

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 パッケージを拡張するにはチャネルのサポートを使用すると、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(']')
ログイン後にコピー

結論

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

以上がメモリにロードせずに大規模なデータ ストリームを JSON で効率的にマーシャリングする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!