大きな JSON ファイルの Json.NET ストリーミング
多数の同一オブジェクトを含む非常に大きな JSON ファイルを扱う場合、メモリに過負荷をかけずに効率的に解析することが重要です。 1 つのアプローチは、ファイルをストリームとして解析し、一度に 1 つのオブジェクトを読み取り、処理することです。
直接逆シリアル化の課題
最初に、JsonSerializer.Deserialize<myobject>(reader)
を使用してオブジェクトを直接逆シリアル化しようとすると、JSON ファイルには単一のオブジェクトではなくオブジェクトのリストが含まれるため、失敗します。オブジェクトをリストに逆シリアル化することで問題は解決しましたが、リストには逆シリアル化されたオブジェクトがすべて保持されていたため、過剰な RAM 使用量が発生しました。
ストリームベースのメソッド
これらの課題に対処するためのより効率的なアプローチは、ファイルをストリームとして解析し、各オブジェクトを 1 つずつ読み取ることです。次の C# コードは、このアプローチを示しています。
<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>このソリューションでは、リーダーがオブジェクトの始まりを示す左中括弧 "{" に遭遇するまで、ストリームは 1 文字ずつ進みます。次に、
メソッドを使用してオブジェクトを逆シリアル化します。オブジェクトが処理されると、そのオブジェクトは RAM から破棄されるため、ファイル全体をメモリ内に保持せずに次のオブジェクトを読み取ることができます。 Deserialize
ストリーム解析に基づく利点
このフローベースのアプローチには次のような大きな利点があります。
結論
RAM を過負荷にすることなく個々のオブジェクトを効率的に処理する機能を使用して、大きな JSON ファイルを Json.NET のストリームとして解析します。このアプローチは、メモリ使用量が制限されている場合に特に役立ちます。以上がJson.NET で大きな JSON ファイルをストリームとして効率的に解析するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。