Gason , переведенный на C #, вероятно, самый быстрый парсер на языке C #, скорость аналогична версии C ++ (Debug Build, в 2 раза медленнее в выпуске), потребление памяти в 2 раза больше:
https://github.com/eltomjan/gason
(Отказ от ответственности: я связан с этим C # форком Гасона.)
У синтаксического анализатора есть экспериментальная функция - выход после анализа предварительно определенного числа строк в последнем массиве и продолжение в следующий раз после последнего элемента в следующем пакете:
using Gason;
int endPos = -1;
JsonValue jsn;
Byte[] raw;
String json = @"{""id"":""0001"",""type"":""donut"",""name"":""Cake"",""ppu"":0.55,
""batters"": [ { ""id"": ""1001"", ""type"": ""Regular"" },
{ ""id"": ""1002"", ""type"": ""Chocolate"" },
{ ""id"": ""1003"", ""type"": ""Blueberry"" },
{ ""id"": ""1004"", ""type"": ""Devil's Food"" } ]
}"
raw = Encoding.UTF8.GetBytes(json);
ByteString[] keys = new ByteString[]
{
new ByteString("batters"),
null
};
Parser jsonParser = new Parser(true); // FloatAsDecimal (,JSON stack array size=32)
jsonParser.Parse(raw, ref endPos, out jsn, keys, 2, 0, 2); // batters / null path...
ValueWriter wr = new ValueWriter(); // read only 1st 2
using (StreamWriter sw = new StreamWriter(Console.OpenStandardOutput()))
{
sw.AutoFlush = true;
wr.DumpValueIterative(sw, jsn, raw);
}
Parser.Parse(raw, ref endPos, out jsn, keys, 2, endPos, 2); // and now following 2
using (StreamWriter sw = new StreamWriter(Console.OpenStandardOutput()))
{
sw.AutoFlush = true;
wr.DumpValueIterative(sw, jsn, raw);
}
Теперь это быстрый и простой способ разделения длинных JSON - целых 1/4 ГБ, <18 миллионов строк в основном массиве за <5,3 с на быстрой машине (Debug Build) с использованием <950 МБ ОЗУ, Newtonsoft.Json потребляется> 30s / 5.36GB. Если анализируется только первые 100 строк <330 мс,> 250 МБ ОЗУ.
В Release Build еще лучше <3,2 с, где Ньютон потратил> 29,3 с (> в 10,8 раза лучше).
1st Parse:
{
"id": "0001",
"type": "donut",
"name": "Cake",
"ppu": 0.55,
"batters": [
{
"id": "1001",
"type": "Regular"
},
{
"id": "1002",
"type": "Chocolate"
}
]
}
2nd Parse:
{
"id": "0001",
"type": "donut",
"name": "Cake",
"ppu": 0.55,
"batters": [
{
"id": "1003",
"type": "Blueberry"
},
{
"id": "1004",
"type": "Devil's Food"
}
]
}