似乎没有简单的方法可以做到这一点System.Text.Json
因为你不能使用Stream
对象与System.Text.Json.Utf8JsonReader
直接地。要绕过此限制,您需要使用以下命令将文件内容放入内存中System.Text.Json.JsonDocument
对象如此明显,会占用大量内存。
目前,根据网上的信息,唯一的解决方案是记忆效率高是使用Newtonsoft.Json图书馆。
using (var streamReader = new StreamReader(sourceFilePath))
using (var jsonTextReader = new JsonTextReader(streamReader))
using (var streamWriter = File.CreateText(destinationFilePath))
using (var jsonTextWriter = new JsonTextWriter(streamWriter))
{
jsonTextWriter.Formatting = Formatting.Indented;
while (jsonTextReader.Read())
{
jsonTextWriter.WriteToken(jsonTextReader);
}
}
使用 1MB 缓冲区而不是默认的 4kB,速度要快得多。
在 5 分 5 秒内将 6.33 GB 的文件缩进至 13.7 GB,总共约 200,000,000 行。它在 HDD 上读写,在 Visual Studio(调试版本)中运行,仅使用 17MB RAM。由于空间限制,无法在 SSD 上进行测试。
string filename = @"VeryBig.json";
using FileStream inputFileStream = new(filename, FileMode.Open, FileAccess.Read, FileShare.Read, 1 * 1024 * 1024);
using StreamReader streamReader = new(inputFileStream);
using JsonTextReader jsonTextReader = new(streamReader);
string filenameOutput = Path.ChangeExtension(filename, ".indented.json");
using FileStream outputFileStream = new(filenameOutput, FileMode.OpenOrCreate, FileAccess.Write, FileShare.Read, 1 * 1024 * 1024);
using StreamWriter streamWriter = new(outputFileStream);
using JsonTextWriter jsonTextWriter = new(streamWriter);
jsonTextWriter.Formatting = Formatting.Indented;
while (jsonTextReader.Read())
{
jsonTextWriter.WriteToken(jsonTextReader);
}