2017-05-29 28 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()后。