首页 > 解决方案 > IDataReader 为 20m 条记录消耗大量内存

问题描述

我的代码看起来像这样

using (IDataReader dr = cmd.ExecuteReader())
{
   while (dr.Read()){
       for (int k = 0; k < 50; k++){
           //read a table of 50 columns and 20 millions of rows into an array string[] data
       }
       ListOfArrayOfStringData.Add(data);
   }
}

我的程序在阅读 5 分钟后冻结了计算机。我打开 MSSMS 2016 并插入相同的查询"SELECT * FROM theSameTable_I_TriedToReadWithTheAboveCode",只需 7 分钟即可完成所有记录的显示,并且消耗的总内存仅约为 500 MB,这是我在 TaskManager 中看到的最大值。这很奇怪。MSSMS 2016 似乎正在使用一些新的魔法,不是吗?

标签: c#

解决方案


当您从代码和管理工作室读取数据库时,情况完全不同。这并不是真正的魔法,只是工作室在返回行时不会阻塞。

当您想从数据库加载这么多行时,您应该使用某种分页:https ://docs.microsoft.com/en-us/aspnet/web-forms/overview/data-access/paging-and -排序/高效分页通过大量数据-cs

获取一些行,对它们进行一些处理,然后获取下一批

下一行:

ListOfArrayOfStringData.Add(data);

如果您获得所有内容,将需要使用大量的应用程序内存。查询可能会结束,但单独的 for 循环将需要大量时间才能完成,从而使您的应用程序冻结。

MsSql 管理工作室正在使用线程、内部分页等来解决所有这些问题。


推荐阅读