2017-02-08 73 views
1

我有一個大的JSON對象,我需要傳遞給瀏覽器中顯示的視圖。由於我無法使用Action來返回此JSON對象,所以我想在Razor視圖中添加JSON對象。MVC剃刀視圖'System.OutOfMemoryException'與大值字符串

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

  2. 上述作品如我所料方式的<textarea style="display:none"> @fileContent </textarea>

沒有,給我,

異常類型 'System.OutOfMemoryException的' 的是拋出。

描述:執行當前Web請求期間發生未處理的異常。請查看堆棧跟蹤以獲取有關該錯誤的更多信息以及源代碼的位置。

異常詳細信息: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(字符串值)+186
System.IO.StringWriter.Write(String value)+30
System.Web.WebPages.WebPageBase。寫(對象的值)+87

+0

什麼是'fileContent'?將它發送到視圖然後再次將其發回原來的內容有什麼意義? –

+0

導致'OutOfMemoryException'的因素很多,例如'StringBuilder'溢出或者某些線程缺少內存分配。檢查控制器代碼以確保正確處理資源分配。 –

+0

@StephenMuecke fileContent是一個JSON字符串。我將該字符串轉換爲客戶端Java腳本中的JSON對象。這個JSON對象將用於呈現頁面。 – Geeganage

回答

-2

根據您的CSV文件的大小,最好使用ReadLinesReadAllText象下面這樣:

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

不知道它是否有效,但我的想法是在執行傳遞字符串數組的「ReadLines」後,將每行的JSON字符串拆分爲多個隱藏字段。 '@for(int i = 0; i