C# 实体框架核心性能优化,可吸收同一表的超大文件夹

C# 实体框架核心性能优化,可吸收同一表的超大文件夹,c#,xml,entity-framework-core,etl,bulkinsert,C#,Xml,Entity Framework Core,Etl,Bulkinsert,我有一个C语言的后台服务,它将3600个xml文件(总共5Gb文件大小)接收到SQL Server数据库。完成摄入的持续时间约为16小时。我使用hangfire创建了3个作业/线程,每个作业都有一个要接收的文件夹,即文件夹A、B、C 问题是文件夹C非常重。我的想法是将文件夹C中的文件分为两个文件夹,文件夹C1和文件夹C2。现在,我有4个作业/线程,文件夹A、B、C1和C2。但问题是C1和C2作业命中数据库错误,我认为这是因为它们都评估到同一个表中 保存上下文更改时数据库中发生异常 键入“xxxC

我有一个C语言的后台服务,它将3600个xml文件(总共5Gb文件大小)接收到SQL Server数据库。完成摄入的持续时间约为16小时。我使用hangfire创建了3个作业/线程,每个作业都有一个要接收的文件夹,即文件夹A、B、C

问题是文件夹C非常重。我的想法是将文件夹C中的文件分为两个文件夹,文件夹C1和文件夹C2。现在,我有4个作业/线程,文件夹A、B、C1和C2。但问题是C1和C2作业命中数据库错误,我认为这是因为它们都评估到同一个表中

保存上下文更改时数据库中发生异常 键入“xxxContext”。 System.InvalidOperationException:在此服务器上启动了第二个操作 上一个操作完成之前的上下文。这通常是由于 由使用同一DbContext实例的不同线程执行

另一次出现此错误时:

保存上下文更改时数据库中发生异常 键入“xxxContext”。System.InvalidOperationException:收集失败 被改进的;枚举操作不能执行

hangfire的错误如下:

Hangfire.Storage.DistributedLockTimeoutException超时已过期。这个 在获取服务器上的分布式锁之前超时 “HangFire:IIngestService.IngestPersonXML”资源

Hangfire.Storage.DistributedLockTimeoutException:超时已过期。这个 在获取服务器上的分布式锁之前超时 “HangFire:IIngestService.IngestPersonXML”资源

当我使用
Parallel.ForEach
时,也会出现以下错误:

System.InvalidOperationException:'更改的操作 非并发集合必须具有独占访问权限。并发的 已对此集合执行更新并损坏了其状态。这个 集合的状态不再正确。'


我只需要插入数据库。不需要更新或删除操作。这方面有什么解决办法吗?

EF不适用于此类操作。使用它。
有一些库无缝地为EF提供了它,但您也可以编写自己的实现——它没有那么复杂

真的不明白这部分吗

我只需要插入数据库。执行所需的更新或删除操作。有什么解决办法吗


那么您是否需要更新?好。。如果您需要更新一组行,请将它们与大容量复制一起插入临时表,然后只进行连接更新。

每个线程都应该有自己的DbContext,并且在每个文件上重新创建DbContext。为了确保速度,您必须使用第三方扩展,例如-
context.BulkCopy(alotofimes)
@SvyatoslavDanyliv那么为什么要使用EF呢?涉及ORM没有任何好处。SqlBulkCopy所需要的只是一个IDataReader,它可以从任何集合中创建。将从XML反序列化的对象复制到DbContext中不会得到任何结果,只会再次将它们取出并将它们提供给SqlBulkCopy。为什么不避免重复的对象和开销呢?@PanagiotisKanavos,我不知道,它是现代的,流行的,有很好的记录;)因为我们的图书馆,我从未使用过EF,我也从未做出妥协。查询和一切都应该尽可能快。@Steve如何反序列化XML文件?模式有多复杂?您的目标是哪个数据库?EF核心和任何ORM在这种情况下都是不合适的,所以您考虑的任何策略都不会有帮助。大多数数据库都有导入XML数据的方法。许多数据库都有远程批量导入数据的方法—SQL Server、MySQL和PostgreSQL.NET提供商提供了这一功能already@SteveSQL Server已经可以通过
OPENROWSET
导入XML文件了。这可能是最简单也是最快的选择。如果对象已经在内存中,您可以使用它创建IDataReader包装器,您可以直接将其馈送到SqlBulkCopy。对不起。打字错误它应该是
Do update或delete operation needed