OutOfMemoryException при чтении строкиC#

Место общения программистов C#
Ответить
Anonymous
 OutOfMemoryException при чтении строки

Сообщение Anonymous »

У меня есть система C# .NET, которая принимает канал данных JSON и преобразует его в объект с помощью преобразователя Newtonsoft.Json.JsonConvert.DeserializeObject.
Этот процесс работает идеально, пока размер строки JSON меньше определенного размера (несколько МБ), но как только возвращаемые данные становятся большими (почти 100 МБ), я получаю сообщение об ошибке 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(_stringBuilder.ToString());
Метод ToString() ему не понравился.

Он также аварийно завершился с ошибкой простая строка типа

Код: Выделить всё

string _convertedString = _stringBuilder.ToString();
Полная ошибка:


Исключение типа «System.OutOfMemoryException» ' произошло в
mscorlib.dll, но не было обработано в пользовательском коде.


На машине установлена ​​64-битная версия Windows и 16 ГБ памяти. .

Итак, какие у меня есть варианты?

Все, что мне нужно, это IQueryable из (очень большого) JSON строка.

Подробнее здесь: https://stackoverflow.com/questions/344 ... g-a-string
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»