Newtonsoft Json解串器不释放内存

时间:2017-04-06 13:58:20

标签: c# memory json.net

我使用带有StreamReader的{​​{1}}反序列化包含数万个小对象的大型JSON文件,并且消耗的方式比我更多的内存认为是合理的(并且耗尽)。我使用我所理解的是读取大文件的推荐模式。

为说明目的简化了代码:

JsonTextReader

VS2015内存分析器告诉我大部分内存都被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); } } 个对象占用,这很奇怪,因为一旦当前令牌被转换Newtonsoft.Json.Linq.JValue就没有理由(至于我担心为什么它不应该被丢弃。

我假设Newtonsoft库保留了迄今为止在内存中解析的所有JSON。我不需要这样做,我想如果我能防止这种情况,我的记忆问题就会消失。

可以做些什么?

1 个答案:

答案 0 :(得分:2)

看起来你不需要使用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