【发布时间】:2016-03-22 14:03:43
【问题描述】:
好的,一堆信息:
场景
- 没有用户界面。
- 我需要在服务器上进行大量计算。
- 就目前而言,预计完成它们的时间是月。
- 我需要使用可用的最佳技术并行化代码。我可以牺牲很多时间来改进它。
- 假定代码的同步部分以最佳方式编写。提高性能的唯一可能方法是并行化独立操作。
计算的性质
- 我需要从 流程图 中执行的操作。而 edge 代表完全独立的操作。在顶点
A中,我开始时只有一项任务要做。当一个任务被执行时,它会创建一堆其他的任务来做。所以最终我将有数百万个任务。可视化:
- 绝大多数操作都非常快。它们需要大约 100 毫秒。但是,其中一些更长。这些是对外部服务的请求。
仅以异步方式运行所有操作的简单方法会杀死机器 - 创建数百万个任务的开销是巨大的。
问题
我应该如何解决这个问题? Parallel? PLINQ?处方药?数据流?还有什么?直接线程池?
【问题讨论】:
-
举个任务的例子。您可以只运行一个循环,而不是数百万个类似的任务。
-
如果这在单个服务器上运行一个月,您还有其他问题需要担心。让它对失败有弹性并能够在失败后恢复将是我的首要任务。为什么您的方案将您限制在一台服务器上?
-
@Sinatr 简单任务示例:“café”->“cafe”。长任务示例:调用谷歌翻译翻译“café”。
-
@IanMercer 确实如此,但稍后会介绍。至于服务器 - 我正在使用 Azure。钱是不买更多资源的理由:)
-
在 Azure 上,您按小时付费,因此您可以在有限的时间内轻松增加额外容量,然后在完成后关闭所有内容。如果你计算真的需要 30 天,那么你的 bug 生命周期会很长。
标签: c# parallel-processing system.reactive tpl-dataflow