Newtonsoft Json 反序列化程序不释放内存



我正在使用带有JsonTextReaderStreamReader来反序列化包含数万个小对象的大型 JSON 文件,并且它消耗的内存比我认为合理的要多(并且用完(。我正在使用我所理解的读取大文件的推荐模式。

为说明性目的而简化的代码:

using (StreamReader streamReader = new StreamReader(stream))
using (JsonTextReader reader = new JsonTextReader(streamReader))
{
    JToken token;
    while (reader.Read() && reader.TokenType != JsonToken.EndArray)
    {
        token = JToken.Load(reader);
        RawResult result = token.ToObject<RawResult>();
        results.Add(result);
    }
}

VS2015内存分析器告诉我,大部分内存被Newtonsoft.Json.Linq.JValue对象消耗,这很奇怪,因为一旦当前令牌被转换ToObject()就没有理由(就我而言(为什么不应该丢弃它。

我假设Newtonsoft库将到目前为止解析的所有JSON保留在内存中。我不需要它来做到这一点,我想如果我能防止这种情况,我的记忆问题就会消失。

能做什么?

看起来你不需要使用 JTokens 作为中介;你可以在循环中直接反序列化到你的RawResult类。

using (StreamReader streamReader = new StreamReader(stream))
using (JsonTextReader reader = new JsonTextReader(streamReader))
{
    var serializer = new JsonSerializer();
    while (reader.Read() && reader.TokenType != JsonToken.EndArray)
    {
        RawResult result = serializer.Deserialize<RawResult>(reader);
        results.Add(result);
    }
}

另请注意,通过将结果项添加到列表中,可以将它们全部保留在内存中。 如果可以一次处理一个结果,并将每个结果单独写入输出(文件、数据库、网络流等(,则也可以通过这种方式节省内存。

        RawResult result = serializer.Deserialize<RawResult>(reader);
        ProcessResult(result);  // process result now instead of adding to a list

相关内容

  • 没有找到相关文章

最新更新