Entity Framework (EF) OutOfMemoryException

本文关键字:OutOfMemoryException EF Framework Entity | 更新日期: 2023-09-27 17:56:09

我有> 67000 条记录从另一个来源进入我的系统。 将业务规则应用于这些记录后,我必须将它们存储到数据库中。 我使用以下代码来执行此操作:

        using (var context = new MyEntities())
        {
            var importDataInfo = context.ImportDataInfoes.First(x => x.ID == importId);
            importedRecords.ForEach(importDataInfo.ValuationEventFulls.Add);
            context.SaveChanges();
        }

执行代码后,我收到以下错误(内存不足异常)

    Error in executing code|Exception of type 'System.OutOfMemoryException' was thrown.*   at System.Data.Mapping.Update.Internal.KeyManager.<WalkGraph>d__5.MoveNext()
   at System.Data.Mapping.Update.Internal.KeyManager.GetPrincipalValue(PropagatorResult result)
   at System.Data.Mapping.Update.Internal.UpdateCompiler.GenerateValueExpression(EdmProperty property, PropagatorResult value)
   at System.Data.Mapping.Update.Internal.UpdateCompiler.BuildSetClauses(DbExpressionBinding target, PropagatorResult row, PropagatorResult originalRow, TableChangeProcessor processor, Boolean insertMode, Dictionary`2& outputIdentifiers, DbExpression& returning, Boolean& rowMustBeTouched)
   at System.Data.Mapping.Update.Internal.UpdateCompiler.BuildInsertCommand(PropagatorResult newRow, TableChangeProcessor processor)
   at System.Data.Mapping.Update.Internal.TableChangeProcessor.CompileCommands(ChangeNode changeNode, UpdateCompiler compiler)
   at System.Data.Mapping.Update.Internal.UpdateTranslator.<ProduceDynamicCommands>d__0.MoveNext()
   at System.Linq.Enumerable.<ConcatIterator>d__71`1.MoveNext()
   at System.Data.Mapping.Update.Internal.UpdateCommandOrderer..ctor(IEnumerable`1 commands, UpdateTranslator translator)
   at System.Data.Mapping.Update.Internal.UpdateTranslator.ProduceCommands()
   at System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager, IEntityAdapter adapter)
   at System.Data.EntityClient.EntityAdapter.Update(IEntityStateManager entityCache)
   at System.Data.Objects.ObjectContext.SaveChanges(SaveOptions options)

我正在使用 EF 4.0。

我的问题是要保存的记录数量有限制吗? 保存大量记录的最佳实践是什么(将它们保存在块中?事务呢?)。

提前感谢大家。

Entity Framework (EF) OutOfMemoryException

您可能希望一次批量

发送该数据,每批发送 1024 条记录。

您可以包装在事务中对记录进行批处理的循环,以便在需要时回滚整个序列。请注意,此事务很可能会升级为分布式事务。

分布式事务只能应用于运行Microsoft分布式事务处理协调器 (MS-DTC) 服务的服务器。在处理分布式事务时,性能会明显下降。

通常,.NET 仅限于在单个集合或其他对象中寻址 2GB 内存。这是因为即使在 64 位环境中,索引器也使用 32 位整数(最大值为 20 亿且会发生变化)。即使对于像整数这样的简单数据类型,单个 int 的大小也意味着单个数组中只能存储 5 亿个整数。对于较大的值类型(如结构),集合的最大元素数变得非常小。

如果你在像Windows XP这样的32位环境中,甚至有更低的限制;整个程序的最大内存空间不能大于2GB。这对像您这样的 ETL 施加了一些相当高的限制,对于您的程序尝试一次处理 67k 内存记录内存不足,我一点也不感到惊讶。

如果可以,解决方案是分小批量处理记录。尝试基于 ID 构造一个语句,其中返回前 100 条记录,其中 ID(希望是自动生成的)大于已检索到的最大 ID。处理记录后,将其处置(或只是孤立它并让 GC 完成其工作)。

相关文章:
  • 没有找到相关文章