我有一个包含数百万条记录的分层结构。我正在对数据库进行递归扫描,以便更新一些连接和一些数据。问题是我得到了一个外存异常,因为整个DB最终被加载到上下文中(惰性)。我不再需要的数据保留在上下文中,没有任何方法将其删除。我也不能使用Using(上下文...)因为我需要活动的上下文,因为我正在进行递归扫描。
请把递归当作事实。谢谢
发布于 2011-03-27 19:42:16
这种类型的操作处理得并不好,使用实体也不能很好地扩展。对于批处理操作,我倾向于使用存储过程。
如果你确实想从上下文中删除/转储对象,我相信this post有一些信息(在底部可以解决你的问题)。
发布于 2011-05-01 18:46:40
只是遇到了同样的问题。在我使用EF作为对象关系映射工具之前,我使用过NHibernate,它也有完全相同的问题。只要上下文是活动的,这些框架就会将对象保留在内存中,这有两个后果:
如果可能,我总是尝试使用纯SQL在数据库上执行大型批处理操作(正如上面的文章清楚地说明的那样),但在这种情况下,这不是一种选择。因此,为了解决这个问题,NHibernate在会话上有一个“清除”方法,它丢弃内存中引用数据库记录的所有对象(新的、添加的、损坏的……)。我尝试在实体框架中模仿这个方法,如下所示(使用上面描述的帖子):
public partial class MyEntities
{
public IEnumerable<ObjectStateEntry> GetAllObjectStateEntries()
{
return ObjectStateManager.GetObjectStateEntries(EntityState.Added |
EntityState.Deleted |
EntityState.Modified |
EntityState.Unchanged);
}
public void ClearEntities()
{
foreach (var objectStateEntry in GetAllObjectStateEntries())
{
Detach(objectStateEntry.Entity);
}
}
}GetAllObjectStateEntries()方法是单独使用的,因为它对其他事情很有用。这将放入一个与Entities类同名的分部类(即EF生成的类,本例中为MyEntities ),因此它在entities实例上可用。
我现在每处理1000条记录就调用这个clear方法,我的应用程序过去运行大约70分钟(只有大约40万个实体要处理,甚至不是数百万个),现在只需要25分钟。内存曾经达到300MB的峰值,现在保持在50MB左右
https://stackoverflow.com/questions/5448950
复制相似问题