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

时间:2017-06-05 14:05:55

标签: c# .net ado

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

我试过了:

List.Dispose(); 
List.Clear();
List = null;
GC.Collect(); 

但记忆力仍然充实。

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

但我必须使用ADO.Net。

1 个答案:

答案 0 :(得分:7)

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

尝试影响GC的方法,但这样做几乎总是一个错误,而且我不会在这里包含voodoo命令,因为我认为这不是修复。

ADO.NET 不是责备在这里; EF在 ADO.NET之上运行。请注意,您可以做的是避免列表;您可以将数据作为序列读取而不需要将其放入列表中,而只需通过读取器处理。或者如果你使用&#34; dapper&#34;等工具。 (在ADO.NET之上的一个非常薄的帮助器),你可以使用.Query<T>(...., buffered: false)(它默认缓冲,因为通常人们不会读取700,000行)。

关于列表的主题:请注意,大型列表会访问&#34;大对象堆&#34;,这会对集合产生更多影响。