c# - 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 似乎正在使用一些新的魔法,不是吗?
解决方案
当您从代码和管理工作室读取数据库时,情况完全不同。这并不是真正的魔法,只是工作室在返回行时不会阻塞。
当您想从数据库加载这么多行时,您应该使用某种分页:https ://docs.microsoft.com/en-us/aspnet/web-forms/overview/data-access/paging-and -排序/高效分页通过大量数据-cs
获取一些行,对它们进行一些处理,然后获取下一批
下一行:
ListOfArrayOfStringData.Add(data);
如果您获得所有内容,将需要使用大量的应用程序内存。查询可能会结束,但单独的 for 循环将需要大量时间才能完成,从而使您的应用程序冻结。
MsSql 管理工作室正在使用线程、内部分页等来解决所有这些问题。
推荐阅读
- google-cloud-ml - 如何获得将图像作为输入以在 Cloud ML Engine 上提供预测的 TensorFlow/Keras 模型?
- email - 处理电子邮件时切换电子邮件帐户
- android - Firebase java.lang.IllegalStateException:您需要在此活动中使用 Theme.AppCompat 主题(或后代)
- python - 复制 y 轴
- powershell - 我可以模拟一个 DllImport-ed 函数吗?
- python - 如何多次循环我的函数 = number_virtuals 中输入的数字?
- javascript - ng-repeat 并选中复选框
- python - 将静态值添加到熊猫系列的函数,直到某个值,但仍根据给定的列值对更改做出反应
- c++ - 友元定义函数的命名空间是什么?
- json - Discord.py bot 给出错误:TypeError:列表索引必须是整数或切片,而不是 str