我家里有很多未使用过的电脑。对我来说,最简单的方法是使用它们并行化我的C#程序,只需很少或不需要更改代码?
我正在尝试的任务涉及循环遍历大量英语句子,数据集可以很容易地分解成更小的块,同时在不同的机器中处理。
答案 0 :(得分:7)
...很少或没有代码更改?
困难。基本上,将WCF视为通过网络在程序的各种实例之间进行通信的一种方式。根据算法,结构可能必须彻底改变,或者根本不改变。无论如何,您必须找到一种方法将问题分成彼此独立行动的部分。然后,您必须设计一种在不同实例之间分配这些部分并收集结果数据的方法。
PLinq提供了一种很好的方法来并行化程序而不需要进行大的更改,但这只适用于一个进程,跨不同的线程,然后只有算法适合并行化。通常,某些手动重构是必需的。
答案 1 :(得分:2)
这可能是不可能的。
如何并行化程序完全取决于程序的功能和编写方式,通常需要进行大量的代码更改,并且会使程序的复杂性大幅增加。
在程序中轻松增加可靠性的常用方法是执行一个重复多次的任务,然后编写一个将该任务拆分为块并将它们发送到不同内核进行处理的函数。
答案 2 :(得分:2)
答案取决于您的应用程序将要执行的工作的性质。不同类型的工作具有不同的可能并行化解决方案。对于某些类型,没有可行/可行的并行化方法。
我能想到的最简单的方案是应用程序可以在离散的作业块中轻松地破解工作。如果是这种情况,那么您只需将应用程序设计为处理单个作业块。为您的应用程序提供接受新作业和交付已完成作业的能力。然后,在它上面构建一个作业调度程序。此调度程序可以是同一应用程序的一部分(将一台计算机配置为调度程序,将其余计算机配置为客户机),或单独的应用程序。
还有其他需要考虑的事项:如何在机器之间进行通信(文件?,网络连接?);应用程序需要能够报告/ be_queried完成的工作百分比吗?是否需要能够强制申请停止处理当前的工作?等)。
如果您需要更详细的答案,请编辑您的问题,并提供有关应用程序,应用程序解决的问题,预期的工作量等的详细信息。然后,社区将提供更具体的答案。
答案 3 :(得分:2)
Dryad(微软的MapReduce变体)正好解决了这个问题(在多台PC上并行化.net程序)。它现在处于研究阶段。 太糟糕了,还没有CTP: - (
答案 4 :(得分:1)
您需要在分布式系统上运行应用程序,谷歌用于分布式计算窗口或网格计算c#。
答案 5 :(得分:1)
每个句子是独立处理的,还是以某种方式合并?如果您的处理一次只能处理一个句子,则根本不需要更改代码。只需在每台机器上执行相同的代码,然后在它们之间划分数据(您的句子列表)。您可以通过在每台计算机上安装一部分数据,或通过共享数据库并为每台计算机分配不同的块来实现此目的。
如果您希望稍微更改代码以促进并行性,请共享整个数据库并让代码“标记”每个句子的处理,然后查找要处理的下一个未标记的句子。这将为您提供thread safety概念的温和介绍 - 确保一个处理器不会对另一个处理器产生负面干扰的技术。
与往常一样,您可以提供的有关特定应用程序的详细信息越多,SO社区就越能够根据您的目的定制答案。
祝你好运 - 这听起来像一个有趣的项目!答案 6 :(得分:0)
在我投资并行化您的程序之前,为什么不尝试将数据集分解成碎片并在每台计算机上手动运行程序并手动整理输出。如果可行,则尝试使用脚本自动化它并编写程序来整理输出。
答案 7 :(得分:0)
有几种软件解决方案允许您使用基于商品的硬件。一个是Appistry。我在Appistry工作,我们已经完成了许多解决方案,可以在数百台机器上运行C#应用程序。
一些有用的链接: http://www.appistry.com/resource-library/index.html
您可以在此免费下载该产品: http://www.appistry.com/developers/
希望这会有所帮助 -Brett
答案 8 :(得分:0)
您可能希望查看 Flow-Based Programming - 它具有Java和C#实现。解决此问题的大多数方法都涉及尝试采用传统的单线程程序并确定哪些部分可以并行运行。 FBP采用了不同的方法:应用程序从一开始就根据多个异步运行的“黑盒”组件进行设计(考虑制造装配线)。由于传统的单线程程序在FBP环境中的作用类似于单个组件,因此扩展现有应用程序非常容易。实际上,现有应用程序的各个部分通常可以被分解并转换为单独的组件,前提是它们可以与应用程序的其余部分(即不是子例程)异步运行。有人称之为“将冰山变成冰块”。)