【问题标题】:C# multithreading a process with a much fewer CPU is faster than a much more CPUC# 多线程处理 CPU 少得多的进程比 CPU 多得多
【发布时间】:2013-02-22 10:01:14
【问题描述】:

目前我们的应用程序正在处理同一目录中大约 1000 多个 XML 文件的大量文件。这些文件都被读取、解析和更新/保存到数据库中。

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

我们观察到,我们的应用程序产生的线程数上升到 30 到 90 个线程,并且上下文切换正在大量增加。这可能是由大量并行执行引起的,但它们都很重要。

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

【问题讨论】:

  • 你能发布一些代码吗?
  • 设计?你是如何进行线程间通信的?您是否将整个文件读入某个 XML 容器并将其排入处理池?

标签: multithreading c#-4.0 concurrency


【解决方案1】:

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

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

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

【讨论】:

  • 感谢 Guffa 的快速回答,但磁盘读取的负责人已经在一个线程中。虽然这对我们还是有帮助的。
猜你喜欢
  • 2012-01-24
  • 2014-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-10
相关资源
最近更新 更多