C# SqlDataAdapter内存使用情况

C# SqlDataAdapter内存使用情况,c#,.net,sqldataadapter,C#,.net,Sqldataadapter,我有一个向网格加载1500000的应用程序。问题是它需要大量内存。(1.8 GB) 我观察到: 如果在SQL查询上运行相同的查询 它大约需要60MB 在应用程序中,如果我只是执行 ExecuteNonQuery()它还需要 大约60MB 当我执行它以DataTable的形式获得输出时,问题就来了,我觉得我这样做的方式存在一些问题。请帮忙 我是这样做的,(即使我调用了SP,它也会执行我作为参数传递的sql) 在将大量数据从文本文件加载到datatables/datagrids时,我遇到了类似的

我有一个向网格加载1500000的应用程序。问题是它需要大量内存。(1.8 GB)

我观察到:

  • 如果在SQL查询上运行相同的查询 它大约需要60MB
  • 在应用程序中,如果我只是执行 ExecuteNonQuery()它还需要 大约60MB
当我执行它以DataTable的形式获得输出时,问题就来了,我觉得我这样做的方式存在一些问题。请帮忙

我是这样做的,(即使我调用了SP,它也会执行我作为参数传递的sql)


在将大量数据从文本文件加载到datatables/datagrids时,我遇到了类似的问题。我正在加载的许多数据很难输入,因为这些文件来自许多不同的来源,有许多不同的版本,所以它们都只是作为文本列加载。我正在加载的很多数据仅仅是一个字符长


讨论.NET中字符串的开销以及它对一个字符的许多元素的影响。它提供了使用ANTs profiler的示例。我得到了试用版,并用它来确认我看到的用法。由于数据的变化,我无法调整我的列类型,但是如果您发现您有可以按字符串以外的内容键入的数据列,那么您可能会发现一些显著的改进。

在将大量数据从文本文件加载到数据表/数据网格时,我遇到了类似的问题。我正在加载的许多数据很难输入,因为这些文件来自许多不同的来源,有许多不同的版本,所以它们都只是作为文本列加载。我正在加载的很多数据仅仅是一个字符长


讨论.NET中字符串的开销以及它对一个字符的许多元素的影响。它提供了使用ANTs profiler的示例。我得到了试用版,并用它来确认我看到的用法。由于数据的变化,我无法调整我的列类型,但是如果您发现您的数据列可以被键入字符串以外的内容,那么您可能会发现一些显著的改进。

也许您可以实现某种分页或“按需加载”


当运行此方法两次时,您会处理旧的数据表,不是吗?

也许您可以实现某种分页或“按需加载”


当运行此方法两次时,您会处理旧的datatable,不是吗?

我正在将结果集加载到DataGridView,如何在那里使用分页?我正在将结果集加载到DataGridView,如何在那里使用分页?您正在加载哪种数据?它是数字、字符串、日期时间还是全部的组合?如果将150万条记录从数据库加载到datatable中,可能会导致大量内存使用。正如Boas所说,在分页上投入一些时间将意味着您不必一次加载整个150万行,并将节省大量内存。这只意味着你更频繁地访问数据库以获得一组新的结果。我正在将所有记录加载到DataTable,然后加载到DataGrid以显示它们。若应用程序可以加载分页,则可以在滚动时实现分页。你知道一个可行的实施方法吗?当然知道。不过,在这样的评论中没有什么可以回答的。基本思想是在任何时候只检索要显示的所需数量的记录。因此,如果只显示50条记录,则只需检索所需的50条,然后单击第二页,抓取下一个要显示的50条。看看其他的SO帖子,比如,或者在谷歌的gridview页面上尝试一些教程等。祝你好运。这肯定会减少内存问题的影响。您正在加载什么类型的数据?它是数字、字符串、日期时间还是全部的组合?如果将150万条记录从数据库加载到datatable中,可能会导致大量内存使用。正如Boas所说,在分页上投入一些时间将意味着您不必一次加载整个150万行,并将节省大量内存。这只意味着你更频繁地访问数据库以获得一组新的结果。我正在将所有记录加载到DataTable,然后加载到DataGrid以显示它们。若应用程序可以加载分页,则可以在滚动时实现分页。你知道一个可行的实施方法吗?当然知道。不过,在这样的评论中没有什么可以回答的。基本思想是在任何时候只检索要显示的所需数量的记录。因此,如果只显示50条记录,则只需检索所需的50条,然后单击第二页,抓取下一个要显示的50条。看看其他的SO帖子,比如,或者在谷歌的gridview页面上尝试一些教程等。祝你好运。这肯定会减少内存问题的影响。
                    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();
                    }