2011-06-28 72 views
1

我有一個應用程序加載1500,000到網格。問題是需要大量的內存。 (1.8 GB)SqlDataAdapter內存使用情況

我觀察了下,

  • 相同的查詢,如果我對SQL查詢 分析器運行需要60MB左右
  • 在實際應用中,如果我只是執行 的ExecuteNonQuery()它也需要 某處大約60MB。

問題出在我執行它來獲取輸出爲DataTable時,我覺得在我這樣做的時候有一些問題。請幫忙。

這是我做的方式,加載了大量的數據時(即使我叫SP,它也執行我作爲一個參數傳遞的SQL)

    using (var conn = new SqlConnection(connStr)) 
        { 
         SqlCommand command = conn.CreateCommand(); 
         //DbCommand command = conn.CreateCommand(); 
         command.CommandTimeout = 30000; 
         conn.Open(); 
         command.CommandType = CommandType.StoredProcedure; 
         command.CommandText = spName; 
         SqlDataAdapter da = new SqlDataAdapter(command); 
         dt = new DataTable(); 
         da.Fill(dt); 
         if (dt != null) 
         { 
          if (dt.Rows.Count == 0) 
          { 
           dt = null; 
          } 
         } 
         conn.Close(); 
        } 

回答

1

我遇到了類似的問題從文本文件到數據表/數據網格。我加載的很多數據不能輕易輸入,因爲這些文件來自許多不同的來源,並且有很多變化,所以它們都只是作爲文本列加載。我正在加載的很多數據只是一個字符長度

This article討論了.NET中字符串的開銷以及它對大量單個字符元素的影響。它提供了使用ANTs分析器的示例。我拿到了試用版,並用它來確認我所看到的使用情況。由於數據的變化,我無法調整列類型,但如果您發現有數據列可以通過字符串以外的類型輸入,那麼您可能會發現一些重要的改進。

+0

嘗試RedGates的內存分析器,但沒有有用的線索。 –

+0

你正在裝載什麼樣的數據?它是數字,字符串,日期時間還是所有的組合?如果您將數據庫中的1.5百萬條記錄加載到數據表中,可能會導致相當多的內存使用量。正如Boas所說,投入一些時間進行分頁將意味着您不必一次加載整個150萬行,並且會節省大量的內存。這隻意味着你更頻繁地訪問數據庫以獲得一組新結果。 –

+0

穆斯,糾正它是數據類型的混合。我將所有記錄加載到DataTable,然後加載到DataGrid以顯示它們。當我們滾動時,如果應用程序可以加載它,則可以實現分頁。你知道一個可行的實施方式嗎? –

0

也許你可以實現一些分頁或「按需加載」?

運行此方法兩次時,您將處理舊的數據表,不是嗎?

+0

我正在加載結果集到一個DataGridView,如何在那裏使用分頁? –