C#ServiceStack.Text分析json的流

时间:2017-01-10 14:30:52

标签: c# json servicestack servicestack-text

我正在创建一个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的子集,但这会产生巨大的开销,因为我会得到一个包含大量重复项的大数组。

在第一种方法中,我可以立即过滤掉它们,从而不会将它们留在内存中。

两者之间的内存占用(包括控制台程序开销):

  • NewtonSoft:30mb
  • ServiceStack.Text:215mb

时间是:

  • NewtonSoft:2.5s
  • ServiceStack.Text:1.5s

内存占用非常重要,因为我将处理大量这些内容。

我明白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个单词。我只是在分析这些数据,所以我无法改变它的结构。它是一个包含单词数组数组的文件。

0 个答案:

没有答案