我正在进行一个批处理过程,它将一个缓慢的遗留数据库(每个记录获取时间为1.4-2ms ......它加起来)的~800,000条记录转储到MySQL中,这可以更快地执行。为了优化这一点,我一直在将所有MySQL记录加载到内存中,这使得使用量大约为200MB。然后,我开始从遗留数据库转储并更新记录。
最初,当这将完成更新记录时,我会调用SaveContext,这将使我的内存从~500MB-800MB跳到1.5GB。很快,我会失去内存异常(运行的虚拟机有2GB的RAM),即使我要给它更多的RAM,1.5-2GB仍然有点过分,这只是一个乐队 - 问题。为了解决这个问题,我开始每10,000条记录调用一次SaveContext,这有点帮助了一些事情,因为我使用委托来从遗留数据库中获取数据并在MySQL中更新它,因此我没有收到太可怕的性能影响。在保存时等待5秒左右,然后在内存中更新已经备份的3000个左右的记录。但是,内存使用量仍在不断增加。
以下是我的潜在问题:
我想到的一个可能的解决方案是以某种方式释放实体使用的内存,我知道我永远不会再次触摸,因为它们已经更新(比如清除缓存,但只针对特定项目),但我不知道不知道实体框架是否可以实现这一点。
有没有人有任何想法?
答案 0 :(得分:6)
您可以在上下文中调用Detach方法,将不再需要的对象传递给它: http://msdn.microsoft.com/en-us/library/system.data.objects.objectcontext.detach%28v=vs.90%29.aspx
答案 1 :(得分:2)
我想知道你最好的选择是不是之前建议的其他工具,或者只是放弃使用实体框架。如果您在没有ORM的情况下执行代码,则可以: