.net 在EF中加载大型集合并保存更改

.net 在EF中加载大型集合并保存更改,.net,sql-server,performance,entity-framework,.net,Sql Server,Performance,Entity Framework,我在实体框架方面遇到问题,希望有人能提供帮助:) 我正在尝试实现的功能:我的应用程序应该能够从第三方应用程序中获取XML转储,查看数据并与应用程序数据库中的内容进行比较,并根据基于实体的XML版本和DB版本的非平凡标准更新任何实体 方法:将所有数据加载到内存中(EF代表DB),在内存中进行所有比较,并将更新写回DB 方法背景(可选阅读):我工作的客户之前曾多次遇到过此类问题,并且从未对他们之前找到的解决方案感到满意。他们的结论是,这是最好的办法。因此,在这一点上,我不是在寻找替代解决方案,而是要

我在实体框架方面遇到问题,希望有人能提供帮助:)

我正在尝试实现的功能:我的应用程序应该能够从第三方应用程序中获取XML转储,查看数据并与应用程序数据库中的内容进行比较,并根据基于实体的XML版本和DB版本的非平凡标准更新任何实体

方法:将所有数据加载到内存中(EF代表DB),在内存中进行所有比较,并将更新写回DB

方法背景(可选阅读):我工作的客户之前曾多次遇到过此类问题,并且从未对他们之前找到的解决方案感到满意。他们的结论是,这是最好的办法。因此,在这一点上,我不是在寻找替代解决方案,而是要找出如何做到这一点,或者确信不能在合理的时间内做到这一点

我的问题:将XML加载到内存中没有问题,从数据库加载更是如此。问题的核心是数据被存储到8个具有连接的表中,主表有近500000行。结果是一个返回大量数据的复杂查询。我尝试了几种方法:

1)只需从SQL Server在一个大请求中加载所有内容。在阅读过程中,它似乎工作了一段时间,直到它使用了大约1.6GB的RAM,当我得到一个OutOfMemoryException时——即使有近10GB的可用RAM。例外情况来自EF内部。在例外情况发生时,大约一半的记录已被读取

2)使用Skip/Take逐条阅读。需要OrderBy,因此我按主表的主键(int,sequential,但不是autoincrement)排序。这使得查询变得更加复杂,末尾有15个以上的ORDER BY语句,其中大约5个是到实际上是我排序依据的主键副本的列。不知道为什么会有这么多副本,但它们在那里。。。查询超时-当然

3)从主表中选择已排序的所有主键。然后取前1000个,创建一个限制对,其中包含1000个中最小的和最大的。对所有1000人的小组重复上述步骤,直到完成。现在多次调用查询,检查每对中两个数字之间的主键,一次加载集合1000。结果证明,这是非常缓慢的-每1000人一组需要45秒,这是远远不能接受的

选项1似乎最接近工作状态,但EF内部似乎存在内存限制。是否有可能以某种方式对其进行调整


我正考虑放弃EF来完成这项任务(即使它在其他地方的应用程序中都被使用),但我想我会先给你一个问题来考虑;-)

大多数Visual Studio项目模板的默认平台目标是x86。您需要将项目更改为目标x64或任何CPU,以便能够使用超过2GB的内存。要执行此操作,请转到项目的属性“构建”选项卡,选择平台目标下的任何CPU


不过,一次加载500000行对我来说仍然是个坏主意,而且在方法#1中您可能还会遇到其他问题。

应用程序是否编译为32位应用程序?您将有一个2 GB进程内存的自然限制,由于可能的内存碎片,该内存通常不能完全使用。有了64位的应用程序和操作系统,进程空间中的可用内存将大大增加,但可能会出现碎片,但可能已经足够了。大多数时候,堆栈溢出是一个很好的提问和获取信息性答案的地方,从中学习——其他时候,当你读到显而易见的答案时,它是一个让你意识到自己是多么愚蠢的地方。。。谢谢你让我觉得自己像个白痴-这节省了我很多时间;-)