C# ADO.NET实体抛出OutOfMemoryException。如何防止这种情况
在SQL Server 2008 R2中,基础表有一个int、guid和Filestream列。文件流显示为字节[]。我观察到的是内存消耗在不断增加。我该怎么办C# ADO.NET实体抛出OutOfMemoryException。如何防止这种情况,c#,.net,memory-management,ado.net,C#,.net,Memory Management,Ado.net,在SQL Server 2008 R2中,基础表有一个int、guid和Filestream列。文件流显示为字节[]。我观察到的是内存消耗在不断增加。我该怎么办 MyEntities bh = new MyEntities (); foreach (var s in bh.TaskGraphs) { try { using (var x = new MemoryStream(s.TaskGraph1)) { //var t
MyEntities bh = new MyEntities ();
foreach (var s in bh.TaskGraphs)
{
try
{
using (var x = new MemoryStream(s.TaskGraph1))
{
//var t = TaskGraph.Load(x);
//Validate(t);
}
}
catch (Exception e)
{
}
}
下面是内存使用模式
我现在观察到,执行bh.TaskGraphs.Select(p=>new{p.TaskGraph1,p.StreamId})会使异常消失。这是由于链接到此表的子表造成的吗
顺便说一句,每个BLOB都是~3MB如果没有更多的信息很难说,但我想,以下至少是问题的一部分:
TaskGraphs
有很多行,或者Filestream
列包含很多日期TaskGraph.Load
和/或Validate
保留对该数据的引用,这样它就不会被垃圾收集myenties
将Filestream
列在内存中保留一段时间,然后再次释放我认为TaskGraph表有很多记录,所以当您调用bh.TaskGraphs时,它会将整个表加载到内存中,其中的二进制数据比可用内存大。 您应该尝试使用存储过程从数据库中只加载您想要的记录,这样就有了另一种方法。 但首先尝试一下:
using(MyEntities bh = new MyEntities())
{
your code.....
}
我不认为有一个简单的解决方案。请看这个相关问题:实体框架将实体加载到实体容器中,容器有一个实体集,其中包含从数据库中获取的实体的本地副本。每个实体都有其对应实体集的引用,整个实体集将保留在内存中并当您从数据库加载实体集时,实体集将不断增长 必须使用与包含主键和其他属性的表以及仅包含主键和blob的另一个表的一对一关系将表分成两部分 接下来在for循环中,当您进行迭代时,您应该通过一个新的上下文加载blob实体,处理字节数组并在for循环结束时销毁上下文。或者您还可以从实体容器中分离一个对象,使其可以自由地进行垃圾收集 在现有代码中,您可以分离实体以释放其所持有的内存
MyEntities bh = new MyEntities ();
foreach (var s in bh.TaskGraphs)
{
try
{
using (var x = new MemoryStream(s.TaskGraph1))
{
//var t = TaskGraph.Load(x);
//Validate(t);
bn.Detach(t);
}
}
catch (Exception e)
{
}
}
即使我在使用中注释掉了函数调用,错误仍然会发生。您可以发布一个错误的完整堆栈跟踪吗?您使用的是实体框架吗?请告诉我们所涉及的数据量。@daniel hilgarth是的,这是实体框架。添加到问题中的详细信息似乎有效。谢谢。还尝试了等效的方法bh.TaskGraphs.MergeOption=System.Data.Objects.MergeOption.NoTracking;