Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ADO.NET实体抛出OutOfMemoryException。如何防止这种情况_C#_.net_Memory Management_Ado.net - Fatal编程技术网

C# ADO.NET实体抛出OutOfMemoryException。如何防止这种情况

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

在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 = 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;