"System.OutOfMemoryException"同时使用ado.net检索700k记录C#

-1 .net c# ado

我第一次将表中的数据填充到列表中然后我清除列表以从不同的表中选择不同的数据,所以我希望从内存中释放第一个列表,因为我将越来越多地获得新数据.

我试过了:

List.Dispose(); 
List.Clear();
List = null;
GC.Collect(); 
Run Code Online (Sandbox Code Playgroud)

但记忆力充沛.

在实体框架中我想出来并添加了.AsNoTracking()它并且它工作并且内存被清除

但我必须使用ADO.Net.

Mar*_*ell 7

你无法告诉GC该做什么.GC发布了GC想要发布的内容.当你处于记忆压力之下时,它通常非常善于释放东西; 如果它无法释放,那么我怀疑这些对象仍然可以访问.特别是,事件是人们意外地保持大量对象可达的非常常见的方式 - 因此您可能想要检查您是否没有任何悬空事件.

办法试图影响GC,但它几乎总是错误的做,我不会有,因为我认为这是不固定的巫术此命令.

ADO.NET 应该归咎于此; EF运行 ADO.NET 之上.请注意,您可以做的是避免列表 ; 您可以将数据作为序列读取无需将其放入列表中,只需通过读取器处理即可.或者如果你使用像"dapper"这样的工具(在ADO.NET之上的一个非常薄的帮助器),你可以使用.Query<T>(...., buffered: false)它(默认情况下它是缓冲区,因为通常人们不会读取700,000行).

关于列表的主题:请注意,大型列表会点击"大对象堆",这会更多地影响集合.