Json.NET 스트리밍 역직렬화: 대규모 JSON 파일의 효율적인 처리
동일한 개체가 많이 포함된 대용량 JSON 파일의 경우 전체 파일을 메모리에 로드하지 않는 것이 중요합니다. Json.NET은 스트림에서 직접 JSON 콘텐츠를 역직렬화하여 메모리 소비를 크게 줄이는 방법을 제공합니다.
초기 시도와 한계
루프에서 개체를 직접 역직렬화하면 파일이 단일 개체로 처리되며 루트 JSON 목록이 있기 때문에 실패합니다. JSON을 C# 목록으로 역직렬화하면 항목을 하나씩 읽을 수 있지만 목록에 역직렬화된 모든 개체가 포함되므로 여전히 많은 메모리를 소비합니다.
스트리밍 역직렬화
스트림의 객체를 순차적으로 읽으려면 각 객체의 시작 위치를 식별하고 이에 따라 역직렬화해야 합니다. 이는 루프 내에서 reader.TokenType
속성을 사용하여 달성할 수 있습니다.
<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>
이 코드는 판독기가 객체({)의 시작 부분을 발견할 때만 역직렬화됩니다. 다른 마커를 건너뛰면 불필요한 RAM을 소비하지 않고 대용량 파일을 효율적으로 구문 분석할 수 있습니다. 읽기 // 处理对象 o
객체가 역직렬화 후에 실제로 처리되어야 함을 독자에게 상기시키기 위해 MyObject
주석이 코드에 추가되었습니다.
위 내용은 Json.NET Stream은 어떻게 대용량 JSON 파일을 효율적으로 역직렬화하여 메모리 사용량을 최소화할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!