多核计算机上的C#并行/多线程/多任务

多核计算机上的C#并行/多线程/多任务,c#,xml,multithreading,xslt,ssis,C#,Xml,Multithreading,Xslt,Ssis,我面临着一个问题,我已经花了很多时间,但现在还不能解决 首先是手头项目的大致情况:我收到大约170k复杂的XML文件,这些文件大小各异(从5KB到10MB),必须加载到SQL Server数据库中。由于它们的结构可能略有不同(并非所有值/节点都是必需的),因此我有一个XSLT文件,它可以帮助“展平”它们,并简化加载它们的过程。由于文件(和数据)数量巨大,我们选择使用比例相当好的服务器:24个物理内核,虚拟化为48个内核,大约512 GB RAM 谈到问题本身:由于SSIS中的XML源对这项任务的

我面临着一个问题,我已经花了很多时间,但现在还不能解决

首先是手头项目的大致情况:我收到大约170k复杂的XML文件,这些文件大小各异(从5KB到10MB),必须加载到SQL Server数据库中。由于它们的结构可能略有不同(并非所有值/节点都是必需的),因此我有一个XSLT文件,它可以帮助“展平”它们,并简化加载它们的过程。由于文件(和数据)数量巨大,我们选择使用比例相当好的服务器:24个物理内核,虚拟化为48个内核,大约512 GB RAM

谈到问题本身:由于SSIS中的XML源对这项任务的性能非常好,我决定创建一个C#Source组件,它负责XML文件的加载和XSLT转换。然而,为了缩小性能问题的范围,我首先创建了一个控制台应用程序来设计和调试我的方法。为了加快所描述的加载过程,我计划在源组件中使用多线程:其想法是并行加载和转换大量XML文件(因为我将XSLT作为编译转换加载)。因此,基本上我计划在SSIS中使用一个组件,它并行加载50或100个文件,然后将数据发送到(当前)10个输出(10个表)

有趣的是:无论我使用什么结构(Parallel.For、task factory、thread queue),我的C#代码都不会创建超过24个线程(物理内核的数量)

根据我的一般理解:据我所知,一个任务需要一个核心,而一个核心可以有许多线程


那么,我做错了什么?我对多线程的一般理解是错误的吗?

并行。For
是为CPU限制的操作而设计的,因此默认情况下将线程数限制为物理内核数(因为更多线程将效率低下)。然而,这一点是可以忽略的:如果你没有很好地展示你在做什么,就没有办法回答你的问题。也就是说,线程池的默认线程数等于内核数,并且仅当排队的工作线程花费的时间太长时才会添加线程。这正是你想要的;如果你的线程比内核多,那么它们会互相争斗,从而降低速度。为什么你希望运行的线程比内核多?他们没有充分利用吗?格威格瓦姆没有,我只达到了50%左右。“虚拟”核心(超线程)保持空闲……如果您有时间/精力探索另一种选择,Saxon EE将提供“开箱即用”的多线程XSLT处理。例如,解析XML文件集合的collection()函数并行处理这些文件,创建输出文件的xsl:result document指令生成新线程(或从池中分配一个线程)。我不能保证这会比手工编写的多线程代码工作得更好,但开发和维护起来肯定会更少。