6

我正在处理一个批处理过程,它将缓慢的遗留数据库(每个记录获取时间1.4-2ms)累积到800,000条记录到MySQL中执行更快一点。为了优化这一点,我一直在将所有的MySQL记录加载到内存中,使用量大约为200MB。然后,我开始从遗留数据库转储并更新记录。实体框架从上下文中删除对象,但不是从数据库中删除对象

最初,当这将完成更新记录时,我会调用SaveContext,然后使我的内存从500MB-800MB跳到1.5GB。很快,我就会发现内存异常(运行的虚拟机有2GB内存),即使我给它更多的内存,1.5-2GB仍然有点过分,并且只会将一个带 - 帮助解决问题。为了解决这个问题,我开始每调用一次10,000条记录就调用SaveContext,因为我使用委托来从旧数据库中获取数据并在MySQL中更新它,但是从性能方面来说, 5秒钟左右,等待它保存它,然后运行内存中的更新,为已备份的3000条记录进行更新。但是,内存使用量仍然在不断增加。

这里是我的潜在问题:

  • 的数据出来,在任何顺序遗留数据库的,所以我不能块的更新和定期发布的ObjectContext。
  • 如果我没有事先获取MySQL中的所有数据,而是在更新过程中通过记录查找它,它非常慢。我反而把它全部抓住,将它转换为由主键索引的字典,当我更新数据时,我从字典中删除记录。

一个可能的解决方案,我认为是以某种方式释放正在使用的,我知道,因为他们已经被更新我再也不会去碰实体内存(比如清除缓存,但只针对特定项目),但我不知道Entity Framework是否可能。

有没有人有任何想法?

+1

EF似乎不适合这份工作。你为什么不直接迁移数据? – Pawel

+0

使用SSIS迁移数据 – fenix2222

回答

2

我想知道,如果你最好的赌注是不是正如上面所提到的另一种工具或只是放弃使用实体框架。如果你不是做代码没有ORM,您可以:

  1. 调整SQL语句来提高性能
  2. 轻松控制和改变,交易的范围,以获得最佳的性能。
  3. 您可以对更新进行批处理,以便您不调用服务器来完成多个更新,而不是一次执行一个更新。