9

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

最初,当这完成更新记录时,我会调用 SaveContext,这将使我的内存从 ~500MB-800MB 跃升至 1.5GB。很快,我就会出现内存不足的异常(运行它的虚拟机有 2GB 的 RAM),即使我要给它更多的 RAM,1.5-2GB 仍然有点过多,那只是放了一个乐队- 帮助解决问题。为了解决这个问题,我开始每 10,000 条记录调用一次 SaveContext,这对事情有所帮助,并且由于我使用委托从遗留数据库中获取数据并在 MySQL 中更新它,因此在在保存时等待大约 5 秒,然后它会在内存中更新已备份的 3000 条左右的记录。但是,内存使用量仍在不断上升。

以下是我的潜在问题:

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

我想到的一种可能的解决方案是以某种方式释放实体使用的内存,我知道我永远不会再碰它们,因为它们已经被更新(比如清除缓存,但仅限于特定项目),但我不知道如果实体框架甚至可以做到这一点。

有人有想法吗?

4

2 回答 2

6

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

于 2012-06-29T01:15:04.803 回答
2

我想知道您最好的选择是不是之前建议的另一个工具,或者只是放弃使用实体框架。如果您在没有 ORM 的情况下执行代码,您可以:

  1. 调整 SQL 语句以提高性能
  2. 轻松控制和更改事务范围以获得最佳性能。
  3. 您可以批量更新,这样您就不会调用服务器来完成多个更新,而是一次执行一个更新。
于 2012-06-29T02:08:55.803 回答