Traitement efficace des gros fichiers JSON : désérialisation du streaming Json.NET
Une analyse efficace est essentielle lorsqu'il s'agit de grands ensembles de données JSON qui ne peuvent pas être entièrement chargés en mémoire. Json.NET fournit une puissante solution de traitement de données JSON en streaming via son JsonReader
.
Aperçu du problème
Un fichier JSON contient une séquence d'objets identiques, le but est de lire un objet à la fois sans charger l'intégralité du fichier en mémoire.
Tentative échouée
La tentative initiale de désérialiser le fichier a entraîné une exception car un tableau JSON était attendu, pas un objet. La désérialisation du tableau en liste a résolu l'erreur mais a entraîné une consommation de mémoire élevée.
Solutions de streaming
Pour contourner ces limitations, la solution proposée lit le fichier JSON caractère par caractère et ne désérialise l'objet que lorsque le lecteur rencontre le caractère "{" indiquant le début de l'objet.
Exemple de code
Voici le code optimisé pour diffuser un fichier JSON en utilisant JsonReader
:
<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 lit le fichier efficacement, désérialisant les objets au fur et à mesure qu'ils sont rencontrés dans le flux, sans prendre trop de RAM. Notez que myobject
doit être remplacé par votre type d'objet réel MyObject
. La gestion des o
objets a été ajoutée au code afin que chaque objet puisse être manipulé après 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!