我有一个C# .NET系统,它接收一个JSON
数据源并使用Newtonsoft.Json.JsonConvert.DeserializeObject
转换器将其转换为对象。
只要JSON字符串大小不超过一定范围(几MB),这个过程就完美运行。但是一旦返回的数据很大(接近100MB),我就会遇到OutOfMemoryException
错误。
这段代码对小数据非常有效:
// WebClient ------------------------------------------------------------------
var _client = new System.Net.WebClient();
var _content = _client.DownloadString(_url);
但是在最后一行(DownloadString
)出现错误。
我尝试更改为以下内容,对于小数据也有效,但当数据增加时,仍会在ReadToEnd
行出现错误。
using (var _response = (System.Net.HttpWebResponse)_request.GetResponse())
{
using (System.IO.Stream _dataStream = _response.GetResponseStream())
{
using (System.IO.StreamReader _streamReader = new System.IO.StreamReader(_dataStream))
{
string _responseFromServer = _streamReader.ReadToEnd();
}
}
}
最后我尝试了这个方法,它有效:
StringBuilder _stringBuilder = new StringBuilder();
using (var _response = (System.Net.HttpWebResponse)_request.GetResponse())
{
using (System.IO.Stream _dataStream = _response.GetResponseStream())
{
using (System.IO.StreamReader _streamReader = new System.IO.StreamReader(_dataStream))
{
while (!streamReader.EndOfStream)
{
char[] _buffer = new char[4096];
_streamReader.ReadBlock(_buffer, 0, _buffer.Length);
var _bufferString = new String(_buffer);
_stringBuilder.Append(_bufferString);
}
}
}
}
但是当它到达这里的下一行时,它会因为OutOfMemoryException
错误而崩溃:
var _results = Newtonsoft.Json.JsonConvert.DeserializeObject<List<MyObject>>(_stringBuilder.ToString());
它不喜欢ToString()
方法。
甚至连简单的一行代码也会崩溃。
string _convertedString = _stringBuilder.ToString();
完整的错误信息为:
机器运行64位的Windows系统,内存大小为16GB。类型为'System.OutOfMemoryException'的异常在mscorlib.dll中发生,但未在用户代码中处理
所以,我的选择是什么?
我想要的只是从(非常大的)JSON字符串中获取一个>。
streamReader.ReadToEnd()
更好(或更高效)。 - Panagiotis Kanavos