我的任务是优化线性数据处理例程的性能。以下是已经存在的内容的概述:
数据从UDP端口进入,我们有多个侦听器监听不同的端口,并将原始数据写入SQL Server数据库(让我们称这个表为RawData)。然后,我们有一个单线程线性应用程序的多个实例,它从RawData表中获取原始数据并处理单独的数据行。处理的意思是将原始数据与先前接收到的给定实体的数据进行比较,进行计算以计算不同读数的数量,然后为每个单独的数据行调用几个web服务,最后为ProcessedData表中的每个数据行添加一个新记录。也会在其他表中更新相应的实体记录。
在我看来,问题可以分解成更小的部分,我可以利用生产者/消费者模式进行数据处理:生产者的一个线程填充共享(阻塞)队列,多个消费者从队列中抓取数据行并对其进行并行处理。消费者完成后,他们将处理后的数据放到另一个共享队列中,然后另一个消费者线程(single)将访问该队列,该线程将执行SqlBulkCopy以插入新记录。在此过程中,将有其他共享队列存储更新的实体信息,而另一个使用者将获取实体的更新信息并执行更新。
问题是,尽管它看起来很简单,但在我看来,它是一种繁琐的方法。我确实觉得有更好的方法来做我想做的事情。对实现上面的生产者/消费者模式有什么建议吗?或者我应该为我的问题寻找不同的设计模式?
提前感谢
发布于 2011-04-12 04:50:09
您提出的解决方案听起来很合理,我一点也不认为它很麻烦。它简单易懂、易于实现、高效有效。它还允许您调整生产者和消费者的数量,以实现最佳性能。分解成更小的部分,并且各部分之间的通信有限,这是一件非常好的事情。
因此,您拥有的是多个线程(生产者)从UDP读取数据并将这些项存储在一个共享队列中。将其称为RawData队列。多个使用者从该队列读取数据,处理项目,并将结果放入另一个共享队列中。将其称为ProcessedData队列。最后,您有一个读取ProcessedData队列并将项存储在数据库中的线程。
.NET BlockingCollection是这方面的最佳选择。
这可能会有一些帮助:Question on C# threading with RFID
https://stackoverflow.com/questions/5626649
复制相似问题