c#中的分布式计算

本文关键字:分布式计算 | 更新日期: 2023-09-27 18:05:03

我有一个特定的DLL,其中包含一些语言处理类和方法。其中一种方法获得一个单词作为参数,并进行一些计算大约3秒,并将相关结果保存在SQL-Server Db上。

我想在900k字上运行这个DLL方法,这个工作可能每周重复一次。如何使用c#轻松地将此工作分发到多个系统以节省时间?

c#中的分布式计算

答案形式:需求—工具

计划运行-石英。净

Quartz允许您在任何给定的时间表上运行"作业"。它还在运行之间维护状态,因此,如果由于某种原因服务器宕机,当它重新启动时,它知道开始运行作业。很酷的东西。

分布式队列——NServiceBus

一个好的ServiceBus是值得的。基本上,您要做的是确保所有工作人员只执行给定的操作,无论有多少操作排队。如果你确保你的操作是幂等的,NServiceBus是一个很好的方法。

队列-> Worker1 += Worker 2 += Worker 3 ->本地数据存储->数据队列+ Worker ->远程数据存储

数据缓存——RavenDb或SQLite

基本上,为了确保给定操作的返回值与SQL Server充分隔离,您需要确保将该值缓存在本地存储系统的某个地方。这可以是像RavenDB这样快速且非关系型的东西,也可以是像SQLite这样结构化的东西。然后,你可以通过NServiceBus将一些标识符扔到另一个队列中,并将其同步到SQL Server,队列是你的朋友!: -)

异步操作——任务并行库和TPL数据流

本质上要确保没有任何操作是阻塞的,并且足够原子化。如果你还不了解TPL,你应该了解一下,它是一些非常强大的东西!我经常从Java人那里听到这样的话,但值得一提的是,c#正在成为一种非常适合异步和并行工作流的语言!

新的异步CTP还有一个很酷的东西是TPL数据流。我还没用过,不过好像正合你的胃口!

由于它是现有的代码,我将寻找一种方法来拆分900k个单词的列表。

其他的都需要更多的改变。

我认为Dryadlinq可以解决这个问题。我只知道,没有亲身经历,但听起来很符合要求。

GJ

您可以创建一个像服务器软件一样的应用程序。它将管理单词列表并将它们分发给客户。您的客户端软件将安装在分布式pc上。然后,您可以使用MSMQ作为来回通信的快速方式。

你的想法是对的。分而治之。这是分布式并行计算的典型工作。假设您有五台机器,每台机器有四个核心,超线程。这将为您提供40个逻辑处理器。

正如您所描述的,您有750小时的处理工作要做,加上一点开销。如果您可以将工作拆分为40个处理线程,则可以在不到20小时内完成所有工作。把工作分开做比较容易。

困难的部分是分配工作并并行执行。正如其他人指出的那样,你在这里有一些选择。我再多送一些,供您考虑。

  1. 您可以通过查询或其他设备手动拆分单词列表,并在每个节点/工作站上启动单独且独特的控制台应用程序,这些应用程序将使用TPL最大化每台机器的每个逻辑处理器。

  2. 你可以使用MPAPI编写自己的节点和worker。

  3. 你可以在你的节点/工作站上安装Windows Server并运行Microsoft HPC和使用MPI之类的东西。

  4. 您可以编写控制台应用程序并使用DuoVia。MpiVisor分发和执行在您的工作站。(充分披露:我是MpiVisor的作者)

祝你好运