在C#和EntityFramework3.5中,我有一个有数百万条记录的上下文。这需要大约2GB的内存。我一打电话给SaveChanges(),它就开始填满我的8 GM并开始交换。
我使用了分析器,结果是SQL querie占用了内存。
现在我想分批存钱,但我遇到了问题。
我有一个Locations集合(这个集合又有一些东西的集合和子集合)。当我将其分批并为每个分批分配一个新的上下文时,当我执行context.AddToOrder(firstBatch)时,所有批中的所有位置都突然拥有实体状态Added,尽管它们没有Order。这使得保存失败,因为Order -> Location关系不存在。
当我只向上下文中添加一个子集时,为什么原始集合中的所有对象都得到状态Added?
发布于 2012-01-13 14:36:12
我有一个有数百万条记录的上下文。这需要大约2GB的内存。
我知道你不会喜欢这个答案,但它很简单。不要这样做, EF,特别是EFv1还没有做好准备。EF甚至不是处理数十个MBs的工具。您必须为这样的大数据集使用其他工具,或者将您的更新分成多个(在您的情况下是数千甚至数百万),每个小的更改集使用自己的上下文。
我猜当您调用SaveChanges时,EF将尝试实现它的魔力,包括检测实体中的更改和准备执行的语句。可能有内存泄漏,但也可能有许多未释放的内存由于GC。在这种情况下,与你目前的问题无关。
顺便说一句。EF将尝试将您的修改存储在单个事务中。因此,如果您试图将2GB保存在单个事务中,那么您可能会在更多级别上出现问题。
https://stackoverflow.com/questions/8849680
复制相似问题