在并行数据处理中使用哪种类型的队列-C#-.NET 4
本文关键字:类型 队列 -C#- NET 种类 数据处理 并行 | 更新日期: 2023-09-27 17:50:24
场景:接收数据并将其写入带有时间戳的数据库。我需要按照根据时间戳接收的顺序处理原始数据,并将其写回数据库,不同的表,再次根据时间戳维护顺序。
我提出了以下设计:创建了两个队列,一个用于存储数据库中的原始数据,另一个用于在将处理后的数据写回数据库之前存储。我有两个线程,一个读取初始队列,另一个读取结果队列。在此期间,我生成多个线程来处理初始队列中的数据并将其写入结果队列。
我尝试过SortedList(手动锁定(和BlockingCollection。我使用了两种并行处理的方法:并行。对于(ForEach(和TaskFactory。任务开始新建。
基于几个因素,每个数据单元可能需要可变的处理时间。一个线程仍然可以处理第一个数据点,而其他线程则分别处理三个或四个数据点。
我最近发现了OrderingPartitioner,我认为它可以解决这个问题,但根据我看到的MSDN示例,它也没有对底层集合进行排序。我可能需要实现自定义分区器来订购复杂数据类型的集合吗?或者可能有更好的方法来解决这个问题?
任何关于类似问题的建议和/或文章链接都将不胜感激。
就我个人而言,我至少会尝试从使用BlockingCollection<T>
作为输入和使用ConcurrentQueue<T>
实例作为结果开始。
我会使用Parallel Linq来处理结果。为了在处理过程中保留顺序,可以对PLINQ语句使用AsOrdered((。
您考虑过PLINQ和AsOrdered((吗?这可能对你想要实现的目标有所帮助。http://msdn.microsoft.com/en-us/library/dd460719.aspx
也许你已经考虑过这些事情,但是。。。
为什么不直接将时间戳传递给数据库,然后让数据库进行排序,或者在所有处理线程返回后修复数据库中的排序?sql语句是否有要按顺序执行?
PLINQ很好,但如果可以的话,我会尽量避免线程同步要求,只需将更多的排序数据传递到数据库。