0

我对实体框架有疑问,希望有人能提供帮助:)

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

方法:将所有数据加载到内存(数据库的EF)并在内存中进行所有比较并将更新写回数据库。

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

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

1)只需将其全部加载到来自 SQL Server 的一个大请求中。似乎在阅读时找到了一段时间,直到它使用大约 1.6 GB 的 RAM,当我得到 OutOfMemoryException - 即使有近 10 GB 的可用 RAM。异常来自 EF 内部。在异常发生时,大约一半的记录已被读取。

2)使用 Skip/Take 逐段阅读。需要 OrderBy,所以我按主表的主键排序(int,顺序但不是自动增量)。这使查询变得更加复杂,最后有 15 多个 ORDER BY 语句,其中大约 5 个是实际作为我排序依据的主键副本的列。不知道为什么有这么多副本,但它们就在那里......查询超时 - 当然。

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

选项1似乎最接近工作,但 EF 内部似乎存在内存限制。有可能以某种方式调整它吗?

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

4

1 回答 1

0

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

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

于 2013-07-26T15:45:18.430 回答