Maison > développement back-end > C++ > Comment Json.NET Stream peut-il désérialiser efficacement les gros fichiers JSON pour minimiser l'utilisation de la mémoire ?

Comment Json.NET Stream peut-il désérialiser efficacement les gros fichiers JSON pour minimiser l'utilisation de la mémoire ?

Susan Sarandon
Libérer: 2025-01-19 01:42:09
original
964 Les gens l'ont consulté

How Can Json.NET Stream Deserialize Large JSON Files Efficiently to Minimize Memory Usage?

Désérialisation streaming Json.NET : traitement efficace des gros fichiers JSON

Pour les fichiers JSON volumineux contenant de nombreux objets identiques, il est crucial d'éviter de charger l'intégralité du fichier en mémoire. Json.NET fournit un moyen de désérialiser le contenu JSON directement à partir du flux, réduisant ainsi considérablement la consommation de mémoire.

Tentatives initiales et limitations

Désérialiser l'objet directement dans la boucle traitera le fichier comme un objet unique, qui échouera en raison de la présence de la liste JSON racine. La désérialisation de JSON dans une liste C#, même s'il est possible de lire les éléments un par un, consomme toujours beaucoup de mémoire car la liste contient tous les objets désérialisés.

Désérialisation en streaming

Afin de lire séquentiellement les objets dans le flux, la position de départ de chaque objet doit être identifiée et désérialisée en conséquence. Ceci peut être réalisé en utilisant l'attribut reader.TokenType dans une boucle :

<code class="language-csharp">JsonSerializer serializer = new JsonSerializer();
MyObject o;
using (FileStream s = File.Open("bigfile.json", FileMode.Open))
using (StreamReader sr = new StreamReader(s))
using (JsonReader reader = new JsonTextReader(sr))
{
    while (reader.Read())
    {
        if (reader.TokenType == JsonToken.StartObject)
        {
            o = serializer.Deserialize<MyObject>(reader);
            // 处理对象 o
        }
    }
}</code>
Copier après la connexion

Ce code ne se désérialise que lorsque le lecteur rencontre le début de l'objet ({). Ignorer d'autres marqueurs garantit une analyse efficace des fichiers volumineux sans consommer de RAM inutile. Le commentaire // 处理对象 o est ajouté au code pour rappeler aux lecteurs que l'objet MyObject lu doit être réellement traité après la désérialisation.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal