2017-02-08 7 views
1

У меня есть большой объект JSON, который мне нужно передать в представление, отображаемое в веб-браузере. Поскольку у меня не может быть Controller с Action для возврата этого объекта JSON, я думал добавить объект JSON в представление Razor.MVC Razor view 'System.OutOfMemoryException' с большой строкой значений

  1. @Html.Hidden("fileContent", fileContent);

  2. <textarea style="display:none"> @fileContent </textarea>

Ни один из указанных выше работ, как пути я ожидал, и дает мне,

Исключение типа 'System.OutOfMemoryException' был выброшены.

Описание: Необработанное исключение произошло во время выполнения текущего веб-запроса. Просмотрите трассировку стека для получения дополнительной информации об ошибке и ее возникновении в коде.

Сведения об исключении: System.OutOfMemoryException: Исправлено исключение типа 'System.OutOfMemoryException'.

Да, я решил, что лучше перестроить поток по-другому (may be as Mediator suggest или есть действие, чтобы вернуть объект JSON.)

  1. Это ограничение MVC, максимальный размер мы можем для просмотра MVC?
  2. Это из-за конфигурации IIS Express?
  3. Любой другой способ преодолеть эту проблему? Или лучший способ передать большой объект в клиентский браузер.

Благодарим вас за внимание. Любая помощь будет высоко оценен.

EDIT

Контроллер

var file = System.IO.File.ReadAllText(HttpContext.Server.MapPath("~/content/data.csv")); 
ViewData.Add("file", file); 
return View(); 

Стек след

[OutOfMemoryException:. Исключение типа 'System.OutOfMemoryException' был брошен] System.Text .StringBuilder.ExpandByABlock (В t32 minBlockCharCount) +163 System.Text.StringBuilder.Append (Char * значение, Int32 valueCount) +82
System.Text.StringBuilder.AppendHelper (строковое значение) +31
System.Text.StringBuilder.Append (String значение) +186
System.IO.StringWriter.Write (Строковое значение) +30
System.Web.WebPages.WebPageBase.Write (значение объекта) +87

+0

Что такое 'fileContent'? И в чем смысл отправить его на представление, а затем отправить его обратно без изменений? –

+0

Существует много факторов, вызывающих «OutOfMemoryException», например. 'StringBuilder' или отсутствие выделения памяти для определенного потока. Проверьте код контроллера, чтобы обеспечить правильное обращение ресурсов. –

+0

@StephenMuecke fileContent - строка JSON. Я конвертирую эту строку в объект JSON в скрипте java на стороне клиента. Этот объект JSON будет использоваться для отображения страницы. – Geeganage

ответ

-2

В зависимости от размера CSV файла, лучше использовать ReadLines чем ReadAllText, как показано ниже:

var sb = new StringBuilder(); 
sb.Capacity = 16; // default, adjust it to less number as you wish 

foreach (String line in System.IO.File.ReadLines(HttpContext.Server.MapPath("~/content/data.csv"))) 
{ 
    sb.Append(line);  
} 

ViewData.Add("file", sb.ToString()); 

ReadLines возвращает IEnumerable<String>, который читает файл построчно (одна линия в время), поэтому он подходит для определенных файлов, которые потенциально потребляют огромное пространство памяти при сохранении в виде одной большой строки.

Однако, если содержимое файла очень большой, рекомендуется использовать StreamReader вместо StringBuilder, который требует непрерывного размер массива и зависит от heap fragmentation:

using (var sr = new System.IO.StreamReader(HttpContext.Server.MapPath("~/content/data.csv"))) 
{ 
    String line; 
    while ((line = sr.ReadLine()) != null) 
    { 
     // combine source strings here 
    } 
} 

Обратите внимание, что каждый символ требует 2 байта, а строки массив символов , таким образом, должны быть непрерывные массивы, которые влияют на производительность и размер во время генерации объектов в памяти. Следовательно, оптимизация функций сборщика мусора с помощью метода GC.Collect() может оказаться полезной после работы с огромным количеством объектов, требующих немедленной очистки.

Связанные ссылки:

interesting OutOfMemoryException with StringBuilder

MSDN: System.Text.StringBuilder

MSDN: System.IO.StreamReader

Eric Lippert: Out Of Memory” Does Not Refer to Physical Memory

+0

Чтение не является проблемой, запись на просмотр. – CodeCaster

+0

Благодарим за предоставление ценных советов. Файл успешно считывает переменную. (в _ViewData_), возникает ошибка, когда она пытается отобразить элемент DOM с этим значением. – Geeganage

+0

Не уверен, что он работает, но моя идея состояла в том, чтобы разделить строки JSON каждой строкой на несколько скрытых полей после выполнения «ReadLines», которые передавали массив строк, например. '@for (int i = 0; i