【问题标题】:C# - Multicore threading for database intensive appC# - 数据库密集型应用程序的多核线程
【发布时间】:2009-09-23 18:20:39
【问题描述】:

我有一个应用程序,需要在数据库端进行一些验证。每个过程都经过数据库验证(搜索具有大约 600 万条记录的表),然后经过一些 Lucene Index 搜索器(索引是根据这 600 万条记录表构建的)。 由于这些步骤对于通过的每个行项目都是不相交的,因此我正在考虑使用多核线程。 (每行在单个线程上大约需要 1/2 分钟)。

对于 C# 中的多核,我有哪些选择? 是否有一些好的资源/第三方库(我看过 Jeff Ritcher 的 PowerThreading),一些好的教程。

我假设我需要在 N 核机器上做一些线程池。

目前,处理 100 行大约需要 40 秒,希望能在 10 秒左右完成。

谢谢...

【问题讨论】:

  • 这只是复制品吗?这听起来像是“如何在 .NET 中编写多线程代码?”搜索“multithreading [c#]”会发现很多有用的信息。例如,请参阅stackoverflow.com/questions/100291/… 的已接受答案以获取示例技术。
  • 我感觉SQL部分还没有优化,现在开始应用多线程还为时尚早。

标签: c# database multithreading multicore


【解决方案1】:

简单的threading 应该可以让您访问多核。您将不得不考虑线程池的大小,因为您的任务看起来也有很多 IO。

【讨论】:

  • 当您指的是简单线程时,您是在谈论线程池?我在双核机器上尝试了线程池,但仍然获得相同的性能!
  • 还记得 Chris 所说的解耦相互依赖关系吗?
  • 我承认我没有尝试检查多线程是否使用多个内核,但对于 Java 来说确实如此,并且由于全局锁而特别指出对于 Python 来说不是这样。在任何情况下,同步和阿姆达尔定律 (en.wikipedia.org/wiki/Amdahl%27s_law) 都将适用。
  • 是的,多个线程将分布在您的所有内核上,除非您明确阻止这一点。如果线程独立工作,那么您应该获得几乎与内核数量成正比的加速。如果您没有收到,则说明有问题,很可能是全局锁定。
  • 如果计算是独立的且受 IO 限制,您可能能够获得比核心数量更大的加速。
【解决方案2】:

你看过F#吗?

它是从一开始就为并行化任务而设计的。

【讨论】:

  • 我现在没有足够的带宽来使用 F#。我会仔细看看的。但是,您可以推荐一些 C# 解决方案吗?
  • 让你的线程尽可能地与相互依赖解耦。
【解决方案3】:

如果您想要四倍的速度提升并拥有四个核心,您需要做的就是避免任务之间的依赖关系,这听起来是可行的。我想你会发现你实际上想要运行比内核更多的线程,因为在任何给定时间,许多线程将被阻塞等待 I/O。因此,我建议,无论您使用哪种方法,都要确保使用不同的线程数轻松对其进行基准测试。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-05
  • 1970-01-01
  • 1970-01-01
  • 2016-08-20
  • 1970-01-01
相关资源
最近更新 更多