Maison >développement back-end >Golang >Comment puis-je décoder en continu des tableaux JSON massifs pour éviter les problèmes de mémoire ?

Comment puis-je décoder en continu des tableaux JSON massifs pour éviter les problèmes de mémoire ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-17 10:48:25293parcourir

How Can I Stream Decode Massive JSON Arrays to Avoid Memory Issues?

Décodage en streaming de tableaux JSON massifs

La récupération de grands tableaux JSON à partir de fichiers peut être gourmande en mémoire lors de l'utilisation d'Unmarshal, car elle charge l'intégralité de données en mémoire à la fois. Pour résoudre ce problème, nous pouvons exploiter les techniques de streaming pour traiter le tableau élément par élément.

Exemple d'utilisation de Stream Decoder

Le package encoding/json fournit une solution pour le streaming JSON. traitement. Voici un exemple étendu tiré de la documentation du package :

package main

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!"}
                ]
            `
    type Message struct {
        Name, Text string
    }
    dec := json.NewDecoder(strings.NewReader(jsonStream))

    // read open bracket
    t, err := dec.Token()
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("%T: %v\n", t, t)

    // while the array contains values
    for dec.More() {
        var m Message
        // decode an array value (Message)
        err := dec.Decode(&m)
        if err != nil {
            log.Fatal(err)
        }

        fmt.Printf("%v: %v\n", m.Name, m.Text)
    }

    // read closing bracket
    t, err = dec.Token()
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("%T: %v\n", t, t)

}

Dans cet exemple, nous créons un décodeur de flux (dec) et utilisons dec.More() dans une boucle pour parcourir les éléments du tableau. Chaque message est décodé et son contenu imprimé sans charger l'intégralité du tableau en mémoire.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn