2017-05-29 33 views
0

我正嘗試序列化每個12列的900000條記錄到JSON對象並通過HTTP在.NET中進行流式傳輸。我得到一個內存不足的例外,因爲它看起來像對象最初創建,然後流式傳輸(我通過調試應用程序意識到這一點)。這是到目前爲止我的代碼:在.NET中序列化大型JSON和通過HTTP流式傳輸

public class JsonStreamingResult : ActionResult 
{ 
    private IEnumerable itemsToSerialize; 

    public JsonStreamingResult(IEnumerable itemsToSerialize) 
    { 
     this.itemsToSerialize = itemsToSerialize; 
    } 

    public override void ExecuteResult(ControllerContext context) 
    { 
     var response = context.HttpContext.Response; 
     response.ContentType = "application/json"; 
     response.ContentEncoding = System.Text.Encoding.UTF8; 
     JsonSerializer serializer = new JsonSerializer(); 

     object itm; 

     using (StreamWriter sw = new StreamWriter(response.OutputStream)) 
      using (JsonTextWriter writer = new JsonTextWriter(sw)) 
      { 
       writer.WriteStartArray(); 
       foreach (object item in itemsToSerialize) 
       { 
        Newtonsoft.Json.Linq.JObject obj = Newtonsoft.Json.Linq.JObject.FromObject(item, serializer); 
        obj.WriteTo(writer); 
        writer.Flush(); 
       } 

       writer.WriteEndArray(); 
      } 
    } 
} 

public class HomeController : Controller 
{ 

    public ActionResult Index() 
    { 
     return View(); 
    } 

    public ActionResult streamMason(int id) 
    { 
     var masonItems = new List<object>(); 
     DataContext dc = new DataContext(); 
     var viewData = dc.Articles.GetPublishedArticles(null, id); 

     int cnt = 0; 

     for (int i = 0; i < 900000; i++) 
     { 
      masonItems.Add(new 
        { 
        Field1 = "test1", 
        Field2 = "test2", 
        Field3 = "test3", 
        Field4 = "test4", 
        Field5 = "test5", 
        Field6 = "test6", 
        Field7 = "test7", 
        Field8 = "test8", 
        Field9 = "test9", 
        Field10 = "test10", 
        Field11 = "test11", 
        Field12 = "test12" 
        }); 
     } 

     return new JsonStreamingResult(masonItems); 
    } 
} 

我的問題:是否有可能流呢同時正在生成的對象?

我的代碼是基於這樣的:Streaming large list of data as JSON format using Json.net

編輯:當我嘗試用更少的記錄,以連載(最多〜30萬),它按預期工作。

+0

通過調試應用程序,我意識到它在'writer.WriteEndArray();'之後得到內存不足。它看起來像是首先將對象序列化並隨後通過HTTP發送。是否可以使用Async並行執行這些操作? – jackgu1988

回答

2

找到了解決辦法,併發布有興趣的人士:

只需添加:response.Flush()writer.Flush()後。