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 ?
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!