2013-02-22 72 views
0

目前,我们的应用程序正在处理大量关于同一目录中超过1000个XML文件的文件。这些文件全部被读取,解析并更新/保存到数据库。C#使用更少的CPU对进程进行多线程处理速度要快得多CPU

当我们在12核心机器上测试我们的应用程序时,整个过程比在4核心机器上处理它要慢得多。

我们观察到的是,由我们的应用程序产生的线程数量达到30到90个线程的范围,并且上下文切换开始大量增加。这可能是由许多并行执行引起的,但所有这些都很重要。

上下文切换是罪魁祸首吗?或并行读取/写入文件?或者我们是否减少了并行任务的数量?

+0

你能发表一些代码吗? – 2013-02-22 10:04:36

+0

设计?你如何做你的线程间通信?你是否将整个文件读入某个XML容器并将其排入处理池? – 2013-02-22 13:30:36

回答

1

瓶颈在这里是磁盘访问。无论启动多少个线程,文件系统一次只能读取一个文件。启动更多线程只会让他们争夺这个单一资源,同时增加上下文切换和磁盘搜索时间。

在进程的另一端也是一个限制,因为一次只有一个线程可以更新数据库中的表,但数据库被设计为处理多个进程。

使单个线程负责磁盘读取,一旦读取了文件,它就可以启动一个处理该文件的线程。这样你可以以最有效的方式从磁盘读取数据,并且在瓶颈后面有多线程操作部分。

+0

感谢Guffa的快速回答,但负责磁盘读取的内容已经在单个线程中。尽管这对我们仍然有帮助。 – 2013-02-22 10:42:48