Maison >développement back-end >Golang >Comment puis-je traiter efficacement de grands tableaux JSON sans les charger entièrement en mémoire dans Go ?

Comment puis-je traiter efficacement de grands tableaux JSON sans les charger entièrement en mémoire dans Go ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-25 09:00:14302parcourir

How can I efficiently process large JSON arrays without loading them entirely into memory in Go?

Décodage JSON à grand flux

Lorsque vous traitez des tableaux JSON massifs stockés dans des fichiers, il est crucial d'éviter de charger l'intégralité du tableau en mémoire, car cela peut conduire à un dépassement de capacité. erreurs de mémoire. Envisagez plutôt de diffuser les données JSON élément par élément.

Une approche pour y parvenir est démontrée dans la documentation encoding/json :

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 de code :

  • Un objet décodeur (dec) est créé pour lire les données JSON à partir d'une chaîne.
  • Le décodeur lit les jetons un par un, en commençant par le crochet ouvrant du tableau.
  • Une boucle for parcourt les éléments du tableau, analysant chacun dans une structure Message.
  • Les noms et le texte de chaque message sont imprimés.
  • La boucle continue jusqu'à ce qu'il n'y ait plus d'éléments disponibles dans le tableau, indiqué par la fonction dec.More().
  • Enfin, le décodeur lit et imprime le crochet fermant du tableau.

Cette approche vous permet de diffuser un grand tableau JSON sans charger toute la structure de données en mémoire, optimisant ainsi l'utilisation des ressources et permettant un traitement efficace.

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