gpt4 book ai didi

c# - Entity Framework 从上下文中删除对象,但不从数据库中删除对象

转载 作者:太空狗 更新时间:2023-10-29 20:17:46 26 4
gpt4 key购买 nike

我正在处理一个批处理过程,它将大约 800,000 条记录从一个缓慢的遗留数据库(每条记录获取时间 1.4-2 毫秒……累加起来)转储到 MySQL 中,这样执行速度会更快一些。为了优化这一点,我一直将所有 MySQL 记录加载到内存中,这使使用量达到了大约 200MB。然后,我开始从遗留数据库中转储并更新记录。

最初,当这完成更新记录时,我会调用 SaveContext,这会使我的内存从 ~500MB-800MB 跳到 1.5GB。很快,我就会遇到内存不足的异常(正在运行的虚拟机有 2GB 的 RAM),即使我给它更多的 RAM,1.5-2GB 仍然有点过分,这只是把一个带- 帮助解决问题。为了解决这个问题,我开始每 10,000 条记录调用一次 SaveContext,这对事情有所帮助,因为我使用委托(delegate)从遗留数据库中获取数据并在 MySQL 中更新它,所以我没有收到太可怕的性能打击,因为在保存时等待 5 秒左右,然后它会在内存中运行已备份的 3000 条左右记录的更新。但是,内存使用量仍然在不断上升。

这是我的潜在问题:

  • 数据以任何顺序从遗留数据库中出来,所以我无法分块更新并定期释放 ObjectContext。
  • 如果我不事先从 MySQL 中获取所有数据,而是在更新过程中按记录查找数据,速度会非常慢。相反,我预先获取所有数据,将其转换为由主键索引的字典,并在更新数据时从字典中删除记录。

我想到的一个可能的解决方案是以某种方式释放我知道我永远不会再接触的实体正在使用的内存,因为它们已经更新(比如清除缓存,但仅限于特定项目),但我不'知道使用 Entity Framework 是否有可能做到这一点。

有没有人有什么想法?

最佳答案

您可以在上下文中调用 Detach 方法,将您不再需要的对象传递给它: http://msdn.microsoft.com/en-us/library/system.data.objects.objectcontext.detach%28v=vs.90%29.aspx

关于c# - Entity Framework 从上下文中删除对象,但不从数据库中删除对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11254642/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com