gpt4 book ai didi

c# - Linq System.OutofMemoryException 异常

转载 作者:太空狗 更新时间:2023-10-30 00:04:44 26 4
gpt4 key购买 nike

我在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com