我正在创建一个json反序列化器。我正在反序列化一个非常大的json文件(25mb),其中包含大量信息。它是一个单词数组,有很多重复。使用NewtonSoft.Json
,我可以将输入反序列化为stream:
using (var fs = new FileStream(@"myfile.json", FileMode.Open, FileAccess.Read))
using (var sr = new StreamReader(fs))
using (var reader = new JsonTextReader(sr))
{
while (reader.Read())
{
//Read untill I find the narrow subset I need and start parsing and analyzing them directly
var obj = JObject.Load(reader); //Analyze this object
}
}
这允许我继续阅读json的小部分并分析它并检查重复等。
如果我想对ServiceStack.Text
做同样的事情。我正在做类似的事情:
using (var fs = new FileStream(@"myfile.json", FileMode.Open, FileAccess.Read))
using (var sr = new StreamReader(fs))
{
var result = ServiceStack.Text.JsonSerializer.DeserializeFromReader<MyObject>(sr);
}
MyObject
只包含我感兴趣的json的子集,但这会产生巨大的开销,因为我会得到一个包含大量重复项的大数组。
在第一种方法中,我可以立即过滤掉它们,从而不会将它们留在内存中。
两者之间的内存占用(包括控制台程序开销):
时间是:
内存占用非常重要,因为我将处理大量这些内容。
我明白ServiceStack方法会给我TypeSafety的安全性,但内存占用对我来说更重要。
我可以看到ServiceStack.Text
的速度要快得多,所以我想知道我是否可以重新创建NewtonSoft
示例,但使用ServiceStack.Text
?
编辑(添加了我尝试解析的对象):
public class MyObject
{
public List<List<Word>> Words { get; set; }
}
public class Word
{
public string B { get; set; }
public string W { get; set; }
public string E { get; set; }
public string P { get; set; }
}
在我的测试文件(代表用例)中,它有29000个单词,但只有大约8500个单词。我只是在分析这些数据,所以我无法改变它的结构。它是一个包含单词数组数组的文件。