C# 导入大量xml文件

C# 导入大量xml文件,c#,xml,sql-server-2008,sqlbulkcopy,C#,Xml,Sql Server 2008,Sqlbulkcopy,将具有不同模式的大量xml文件(例如30000个)导入Sql Server 2008的最佳方法是什么 我目前正在遍历每个文件,将数据加载到datatable并使用SqlBulkCopy插入数据,但这需要很多时间(大约1.5个小时)。这应该不会花这么长时间。据我估计,你有大约600MB的数据;您应该能够毫不费力地接近10MB/s或至少1MB/s,这意味着1-10分钟应该很容易实现 怎么办: 确定哪部分花费了这么长时间 列出可能的瓶颈 测试每一种理论,直到找到罪魁祸首 实施变通方法 没有更多的细

将具有不同模式的大量xml文件(例如30000个)导入Sql Server 2008的最佳方法是什么


我目前正在遍历每个文件,将数据加载到
datatable
并使用
SqlBulkCopy
插入数据,但这需要很多时间(大约1.5个小时)。

这应该不会花这么长时间。据我估计,你有大约600MB的数据;您应该能够毫不费力地接近10MB/s或至少1MB/s,这意味着1-10分钟应该很容易实现

怎么办:

  • 确定哪部分花费了这么长时间
  • 列出可能的瓶颈
  • 测试每一种理论,直到找到罪魁祸首
  • 实施变通方法
没有更多的细节,很难精确,但我可以推测:

  • SqlBulkCopy
    通常速度很快,因此插入可能不是瓶颈。您可以比datatable快一点,但这可能不是问题
  • DataTable
    s可以有“索引”;i、 e.主键和约束条件。这些措施的实施效率很低——这肯定会导致问题
  • 虽然
    SqlBulkCopy
    速度很快,但最好使用多行。如果每个
    SqlBulkCopy
    只复制一个文件,这意味着30000个调用,数据库端可能至少有30000个fsync。您应该只使用一个
    SqlBulkCopy
  • 数据库可能对插入的行具有索引或约束;这些都会严重限制性能检查数据库的负载
  • NET中的大多数xml读取器速度相当快,但单个线程上的10MB/s速度可能会加快速度。如果您的访问模式特别糟糕(例如,加载完整的
    XmlDocument
    并使用大量低效循环和/或XPath进行查询),您可能会遇到CPU负载问题
  • 20KB的文件相当小。如果您是从HDD上读取这些数据,要达到1MB/s,您需要每秒读取50,即延迟20ms。这可能是一个问题,特别是如果文件在磁盘上不是按顺序排列的。并行化可能有点帮助,但SSD会帮助更多(两者都会更好)。但是,您看到的性能远低于此,因此这可能不是您的主要瓶颈
考虑到这一点,我将按以下顺序看

    < li>客户端上的磁盘加载(如果磁盘等待时间很高,考虑SSD和并发)
  • CPU负载-配置文件(无效解析或误用
    DataTable
    s)
  • SqlBulkCopy
    实例-仅使用一个(每个线程)
  • 数据库加载(尽可能去掉任何索引,包括聚集索引)

订单的灵感来自于检查此问题的难度。磁盘负载不太可能有问题,但检查起来很简单,所以您最好从消除这种可能性开始。数据库模式问题并非不太可能,但它们需要更多的工作来识别(它是哪个索引,我删除它是否会影响另一个工作流?),所以我会最后检查这些问题。

Parallel.ForEach
那只小狗。只需将MaxDegreeOfParallelism设置为8或其他值。这是30000个XML文件吗?您正在写入多少行?请看.@ta.speot。将MaxDegreeOfParallelism设置为大于核心数会有什么帮助?文件的大小是多少?如果有大量数据,这将需要时间。