Ian*_*dby 5 c# memory json.net
我正在使用StreamReaderwith JsonTextReader来反序列化包含成千上万个小对象的大型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);
}
}
Run Code Online (Sandbox Code Playgroud)
VS2015内存探查器告诉我,大多数内存都被Newtonsoft.Json.Linq.JValue对象占用,这很奇怪,因为一旦转换了当前令牌ToObject(),就没有理由(就我而言)不应该将其丢弃。
我假设Newtonsoft库会将到目前为止已解析的所有JSON保留在内存中。我不需要它来做,我想如果我能防止这种情况,我的记忆力问题就会消失。
该怎么办?
看起来您不需要使用 JToken 作为中介;您可以直接反序列化到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);
}
}
Run Code Online (Sandbox Code Playgroud)
另请注意,通过将结果项添加到列表中,您可以将它们全部保留在内存中。如果您可以一次处理一个结果并将每个结果单独写入您的输出(文件、数据库、网络流等),您也可以通过这种方式节省内存。
RawResult result = serializer.Deserialize<RawResult>(reader);
ProcessResult(result); // process result now instead of adding to a list
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2649 次 |
| 最近记录: |