我正在研究一个批处理过程,该过程将大约 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 中获取所有数据,而是在更新过程中逐条查找,那么它的速度非常慢。相反,我事先将其全部抓取,将其转换为由主键索引的字典,并在更新数据时从字典中删除记录。
我想到的一种可能的解决方案是以某种方式释放实体使用的内存,我知道我永远不会再碰它们,因为它们已经被更新(比如清除缓存,但仅限于特定项目),但我不知道如果实体框架甚至可以做到这一点。
有人有想法吗?