如何通过并发编程有效地计算大量数据

时间:2015-03-12 09:25:47

标签: c# asynchronous concurrency parallel-processing

我的目标:计算大量的时间序列数据。在输入时,我有与某些数据相关的时间范围(在PI System中)。我一直在计算某些时间范围内的聚合函数,如平均值,最小值,最大值等(在我的情况下,它是一天的跨度)。因此,典型的同步算法大约需要30秒。但是我需要在3秒内显示一些结果。因此,例如,我想首先计算并显示前2个月的数据,同时可以计算其余数据的计算结果。 到目前为止我尝试了什么我了解到有几种类型的并发编程。我的问题是这些方法中的哪一种(多线程,异步程序,并行程序等)将是最佳解决方案。在这个链接https://www.safaribooksonline.com/library/view/concurrency-in-c/9781491906675/ch01.html上,我发现异步主要用于没有CPU限制的操作。但当然,聚合函数的计算是CPU绑定操作。我的老板告诉我,我应该使用异步方式。我不确定这是否是最好的解决方案。  我使用async和wait关键字进行异步算法。芽然后我发现有一种方法。我们可以使用具有各种异步软件模式的委托,如EndInvoke模式,WaitHandler等(http://www.dotnetcurry.com/showarticle.aspx?ID=634)。 所以基本上我的问题是我应该使用哪种并发技术来获得最佳性能。我知道这是一般性问题,但我想在此提出一些您对此主题的建议或想法。 非常感谢您的帮助

2 个答案:

答案 0 :(得分:0)

如果您已拥有数据,并且知道要使用的聚合类型(采样率),则应预先聚合数据。这样,您不必每次都计算聚合,但已经存在聚合。

  

“影响大型数据仓库性能的最具戏剧性的方法是提供与主要基本记录共存的一组适当的聚合(摘要)记录。聚合可以对性能产生非常显着的影响,在某些情况下,可以将查询速度提高一百甚至一千。没有其他方法可以获得如此惊人的收益。“ - Ralph Kimball,1995年

答案 1 :(得分:-1)

您可以逐个启动多个任务,而不是等待先前任务的结果。在最后声明中等待所有任务完成。这是一个示例Task example