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
Susan Sarandonoriginal
2025-01-19 01:42:09965parcourir

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>

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!

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