2011-06-28 76 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,如何在那里使用分页? –