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

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

问题描述:

我首次将表中的数据填充到列表中,然后清除列表以从不同的表中选择不同的数据,所以我想要第一个列表将从内存中释放,因为我将获得越来越多的新数据。使用ado.net检索700k条记录时出现“System.OutOfMemoryException”C#

我曾尝试:

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

但记忆保持完整。

在实体框架我理解了它,并添加了.AsNoTracking()和它的工作和存储器被清除

但我必须使用ADO.Net。

+4

我没有看到问题。 –

+0

尝试添加GC.WaitForPendingFinalizers()之后收集nmethod –

+0

700K记录在内存中......试图想到...为什么你需要这个? – Reniuz

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

还有是试图影响GC的方法,但这样做几乎总是一个错误,我不打算在这里包含voodoo命令,因为我认为这不是解决方法。

ADO.NET 不是责怪这里; EF在 ADO.NET之上运行。请注意,你可以做的是避免列表;您可以将数据作为序列读取,而不需要需要它进入列表,但只需通过阅读器工作即可。或者如果你使用像“dapper”这样的工具(在ADO.NET之上的一个非常简单的帮助器),你可以使用.Query<T>(...., buffered: false)(默认情况下它是缓冲区,因为通常人们没有读取700,000行)。

关于列表主题:请注意,大型列表碰到“大型对象堆”,这会影响集合更多。