2010-08-23 82 views
1

我有一個主要問題。我們有一個asp.net應用程序,該報告顯示了大約1000行,現在可以增長到20000個。不要問我爲什麼,但客戶端不喜歡分頁,不喜歡過濾,他們喜歡在單個頁面上看到所有內容。我們顯而易見的問題是從內存(也是客戶端瀏覽器可能崩潰的因素)角度來看,它將其加載到服務器上的負載。在asp.net頁面上顯示的巨大網格

我的問題是:如果我僅爲此報告提供自定義桌面應用程序,它可以顯示成千上萬行(通過Web服務或遠程),是否會阻塞服務器?在服務器上,IIS的工作進程基本上會在asp.net應用程序中耗盡內存,但是如果我將此桌面應用程序分開運行,並在應用程序服務器上調用相同的數據庫,是否可以解決內存問題?

回答

7

嘗試使用延遲加載網格如的jqGrid:看第三連桿[虛擬滾動]此頁面上:

http://www.trirand.net/demoaspnet.aspx

網格使用Ajax僅加載是可見的數據在特定滾動位置的頁面上。看不到一個控制者。很不錯,如果你必須把它作爲一個ASP.NET頁面。

否則,@ jmein的建議,使其下載是一個很好的。只需使用適當大小的緩衝區將報告流式傳輸到Response流。

另外,請閱讀IEnumerable<T>yield return語句的使用,以最大程度地減少您在響應中加載到內存中以供流式傳輸的數據量。

+0

如果Excel電子表格不是,jqGrid絕對是一個不錯的選擇。它可以輕鬆處理海量數據。但是,由於每列中的數據長度而導致在網格中包含html(如鏈接或圖像)時,它似乎有問題。我相信這是因爲它將數據存儲在dom中的數組中,以便稍後用於排序和過濾。如果有人知道這件事,我會很感激這些信息。 – 2010-08-23 15:04:10

+0

性能問題將與檢索數據時緩存有關,因此,嵌入式控件可能會非常糟糕地觸及此控件,但值得對此進行測試。請參閱我的回答中有關Excel建議的評論。 – 2010-08-23 15:06:19

1

你可以用數據創建一個excel文件,這樣你就不必擔心它了嗎?

+0

Excel是我們正在考慮的一個選擇,並且可以很好上頂的名單。它只是我們可能必須在客戶可能不滿意的Excel表格上妥協的設計級別。但它仍然在桌上! – xeshu 2010-08-23 15:46:02

0

如果您設置一個Web服務來返回20K記錄,每個記錄爲1K,那麼這是一個20MB的服務調用。我同意丹尼爾的觀點,即AJAX延遲加載是爲了讓你一次獲取更小的塊。

1

交付機制並不重要 - 您可以在asp.net或桌面應用程序中執行此操作,而不消耗大量內存。

一般原則是您需要訪問數據爲而不是一次加載到內存中。處理流式數據時,您只能在任何給定時間處理結果的子集。當您移動到流中的下一條記錄時,表示您正在用完成以前的記錄,因此.NET運行時可以回收用於處理它的內存。

在C#中,這意味着使用DataReader(通常通過IDbCommand.ExecuteReader獲得)。直接寫入使用數據讀取器的HttpResponse流的典型片段可能是這樣的(儘管你可以數據綁定到他們以及):

using(IDataReader reader = dataAccessLayer.GetData()) { 

    if (! reader.IsClosed) { 

     // Send writes to the client immediately 
     // reader.Read advances the reader to the next record in the 
     // result set and discards the current record 
     while (reader.Read()) { 

      // Do something with the record - this just writes the first 
      // column to the response stream. 
      Response.Write(reader[0]); 

      // Send the content to the client immediately, even if the content 
      // is buffered. The only data in memory at any given time is the 
      // row you're working on. 
      Response.Flush(); 
     } 
    } 
} 
+0

在你的例子中,數據讀取器需要被打開,直到用戶瀏覽那些非常不可接受的數據塊。我沒有看到任何其他方式,對象將在內存中填充。不能使用AJAX,因爲客戶現在不需要它。 – xeshu 2010-08-23 15:37:12

+0

@xeshu - 我不確定你的意思。我建議您只在需要爲用戶呈現數據(即用戶瀏覽到將顯示數據的頁面)時纔打開數據閱讀器。 – 2010-08-23 16:13:49

+0

這就是問題所在。用戶想要在單個頁面上同時看到成千上萬的行。所以頁面將不得不從內存中渲染所有行。帶有延遲加載的AJAX似乎是一個不錯的選擇,但由於某些原因,我們無法在此特定項目中使用AJAX。 – xeshu 2010-08-25 09:26:21