c# - Linq System.OutofMemoryException 异常

标签 c# sql linq memory database-performance

我在 C# 中有一个长时间运行的进程,它访问 Sql 表 10 到 200 次。当进程每次从同一个表中超过大约 50 次点击和查询超过大约 100,000 行时,它将在此行抛出系统内存不足异常,特别是在将 IQuery 对象转换为列表的底部:

var cht = from p in _db.TickerData
          where p.Time >= Convert.ToDateTime(start) &&
          p.Time <= Convert.ToDateTime(end)
          orderby p.Time
          select p;

_prices = cht.ToList();    < this is where the System.OutofMemoryException occurs >

我能做些什么来防止这个错误??

最佳答案

首先:

specifically at the bottom where it converts the IQuery object to a List

是的,这就是您预计会发生内存不足情况的地方。

cht的赋值以上实际上并没有访问数据库;它所做的只是声明查询的形状。这称为延迟执行,LINQ 到处都在使用它。这意味着“在您的代码需要它之前,我们实际上不会处理任何东西。”

调用 ToList , 不过,本质上是说“代码现在需要它,全部需要它。”所以这就是它将查询发送到数据库的地方,一次拉回所有结果,使用 LINQ 魔法将它们转换为 CLR 对象,并将它们全部填充到 List<T> 中。给你。

话虽如此,这只是一种预感,但您的 LINQ 提供程序可能不知道什么 Convert.ToDateTime是。如果它不知道如何处理,它不会将它放入它执行的查询中的 WHERE 子句中,而是加载整个表并在客户端对其进行过滤,这可能就是当 变得太大,而不是当结果集 变得太大。

要验证这一点,请为您的数据库使用分析器来拦截查询,并查看 WHERE 子句是否符合您的预期。如果翻译不正确,请试试这个:

var startTime = Convert.ToDateTime(start);
var endTime = Convert.ToDateTime(end);
var cht = from p in _db.TickerData
          where p.Time >= startTime && p.Time <= endTime
          orderby p.Time
          select p;
_prices = cht.ToList();

如果这没有帮助,您可能只是撤回了太多数据,您将不得不以与在任何其他环境中处理过多数据相同的方式进行处理。

关于c# - Linq System.OutofMemoryException 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32681094/

相关文章:

sql - 在PowerShell中处理System.DBNull

c# - 按搜索字符串字母顺序 LINQ 开头的名称排序

c# - LINQ 动态查询库设置

c# - 使用 Entity Framework 6 调用数据库函数

c# 如何将变量从方法传递到 main?

java - java连接数据库的驱动

c# - 3.5 VS 4.0 .NET 框架

c# - 如何使用 C# 或 SQL 生成 SQL 数据库脚本?

c# - 在 cms 中制作用户友好的 url

javascript - 使用空白 MVC 路由和 HttpGet 请求 Controller