【发布时间】:2012-01-13 11:12:59
【问题描述】:
在 C# 和 Entity Framework 3.5 中,我有一个包含数百万条记录的上下文。这需要大约 2 GB 的 RAM。只要我打电话给SaveChanges(),它就会开始填满我的 8 GM RAM 并开始交换。
我使用了分析器,结果发现是 SQL 查询占用了内存。
现在我想批量保存,但是遇到了问题。
我有一个Locations 的集合(它又具有东西的集合和子集合)。当我分批拆分它并为每个分配一个新的上下文时,只要我这样做context.AddToOrder(firstBatch),all 批次中的 ALL 位置突然具有实体状态Added,即使他们没有Order。这会导致保存失败,因为 Order -> Location 关系不存在。
当我只将其中的一个子集添加到上下文时,为什么原始集合中的所有对象都获得状态 Added?
【问题讨论】:
-
您确定所有内存都已被应用程序使用吗?或者它可能被 Sql Server 使用。
-
所有 sql 查询字符串都必须在某处生成,我猜那将是 ram。只保存其中的一部分怎么样,也许使用事务范围。
-
不是 SQL 服务器,而是另一台机器。以及关于交易范围;这可能是一种可能性,但我最后一次尝试(几周前)时,它需要在服务器上进行很多奇怪的设置,我停止了它。它需要重新启动,我现在无法重新启动服务器。无论如何,在查看活动监视器之后,SQL 确实还没有被执行,而它正在消耗 RAM。
-
您绝对应该分块保存数据。仅在 RAM 中保存大量数据是不安全的,因为如果您的系统崩溃,任何东西都会丢失。交易应该可以正常工作。
-
安全不是问题;我从头开始生成这些记录,然后保存它们。
标签: c# entity-framework