我正在使用NewtonSoft Json.Net进行一些测试,并且遇到了大型Json数据集的一些问题。
我有一个400MB大小的数据集,似乎无论我如何解析它,我都会一直没有内存异常。我尝试了标准的Parse方法并尝试了解析标记的streamreader方法。无论哪种方式,在某些时候,我最终都会遇到内存异常。
堆栈跟踪表明问题集中在使用Int32索引文档(见下文)。我认为使用JsonTextReader可以解决这个问题,但事实并非如此。
以下是来自服务器的流请求:
public Task<Stream> GetAsync(string command)
{
Task<Stream> promise;
using (var handler = new HttpClientHandler { Credentials = new NetworkCredential(username, password) })
{
var client = new HttpClient(handler);
promise = client.GetStreamAsync(command);
}
return promise;
}
然后,我以这种方式开始工作:
using (Stream s = task.GetAwaiter().GetResult())
using (StreamReader sr = new StreamReader(s))
using (JsonReader reader = new JsonTextReader(sr))
{
while (reader.Read())
{
if( reader.TokenType == JsonToken.PropertyName && reader.Value.ToString() == "Values" ) {
reader.Read();
if( reader.TokenType != JsonToken.StartArray )
break;
while( reader.Read() ) {
// Do more parsing;
}
}
}
}
在Json.net中是否有一些配置我需要设置以避免此问题?或者我是否需要将服务器的响应分解为较小的块?如果是这样,我如何处理部分json?
这是堆栈跟踪:
at System.String.CtorCharArrayStartLength(Char[] value, Int32 startIndex, Int32 length)
at Newtonsoft.Json.Utilities.StringReference.ToString()
at Newtonsoft.Json.JsonTextReader.ParseString(Char quote)
at Newtonsoft.Json.JsonTextReader.ParseValue()
at Newtonsoft.Json.JsonTextReader.ReadInternal()
at Newtonsoft.Json.JsonTextReader.Read()