2012-06-29 74 views
0

在視圖中呈現大量數據的最佳方式是什麼?是以某種方式呈現它的部分?大數據呈現問題

控制器的動作會產生大數據集(1000x1000矩陣)並將其返回給View。當我渲染它時,瀏覽器掛起。數據是由其他服務生成的,我不能用較小的部分得到它。

矩陣是INT值的二維數組。

控制器代碼:

public ActionResult GetData() 
{ 
    var result = ThirdPartyService.GetData(); 

    return View(result); 
} 

查看代碼:

<table>    
     <% foreach (var x = 0; x < Model.Matrix.Count; x++) { %> 
      <tr> 
     <% foreach (var y = 0; y < Model.Matrix[x].Count; y++) { %> 
      <td><% = Model.Matrix[x, y] %></td> 
     <% } %> 
     </tr> 
    <% } %> 
</table> 
+3

用戶應如何處理所有這些數據? –

+0

你如何處理這麼大的一組數據?對於用戶查看1000x1000矩陣來說,這實際上是無用的。 –

+0

另一方面,如果顯示爲每像素數據點1個像素,它會給出非常適中的圖像... –

回答

0

您可以渲染一個空表並從服務器獲取數據以使用ajax來填充它。這樣,您將下載佈局和數據,但不會下載內容。如果你做數學題:

  • <tr></tr>每一行給你09 * 1000 = 9000字節
  • <td></td>每一行中的每個單元格給你09 * 1000 * 1000 = 9000000字節
  • 總計:9009000

您可以減少約9 MB的請求,這是很多!

此外,您可以打開服務器上的GZip,以便數據移動壓縮。

+0

「你可以渲染一個空表」 - 我應該使用JavaScript渲染它? – Alexander

+0

只需在標記中放入'

',然後使用ajax填充它。 – ivowiblo

+0

我應該在哪裏存儲中間結果?控制器的動作調用其他服務方法,返回這個大矩陣。把這個矩陣做成那麼ajax要求它在哪裏更好? – Alexander

1

我想這是大小不是呈現整個頁面上的矩陣,所以我的建議是動態操作DOM,如用戶滾動,通過附加滾動事件。這對我來說非常了不起,通過使用SlickGird作爲數據渲染組件,並使用自定義插件來處理自動完成下拉菜單,其中包含超過1k個元素。瀏覽器在處理大型數據集時沒有問題(我已經測試了多達400k的JS對象),但是在嘗試顯示它時肯定會掛起。所以只需渲染用戶屏幕的一部分即可。

+0

我應該在哪裏保持矩陣?我應該將它保存到DB或其他地方? – Alexander

+0

實際上它被渲染,但它需要太多的時間,在它的瀏覽器不回答。我需要解決它 – Alexander

+0

您可以考慮使用IndexedDB或localStorage保存客戶端(搜索W3C或MDN以作爲這些技術的參考)。什麼是矩陣元素,它是複雜的對象還是數值。如果是後者,則可以將它全部保存在內存中(如果我們用4B存儲數字,則1000 x 1000矩陣將不會超過4M +的開銷),如果用8B存儲8M,等等。) – toske