我在使用C ++处理流数据时遇到了问题。数据来自条目,每个条目的大小相对较小,并且处理每个条目的任务不会花费太多时间。但是每个条目以及该条目的任务处理都被分配给类(一个概念,而不是C ++类),其中只有一个属于同一个类的任务可以在一个时间。
此外,还有数十亿条目和数千万个课程,而且课程是随机课程。
我发现很难并行化这些任务。任何关于如何加快这一过程的建议都将是很有帮助的!
非常感谢!
答案 0 :(得分:0)
将工作条目放入一组特定于类的工作队列中。使用队列大小作为优先级,较大的优先级优先于较小的大小。设置priority queue(队列)以根据类的优先级保存特定于类的工作队列。
如果没有人正在处理该队列,则将工作条目输入到相应的队列中。
设置一个与您拥有的CPU数量大小相同的线程池。
每个线程都会向优先级队列询问最高优先级的工作队列,这个队列可以说是最有效的工作队列。该线程从优先级队列中删除类队列。然后它处理该队列中的所有元素,而不锁定它;这样可以减少每个单元的开销。
如果同时出现该类的新成员,则会将它们添加到该类的新队列中,但不会放在优先级队列中。工作线程使用当前队列,检查同一类的新队列并处理该队列(如果存在)。
答案 1 :(得分:0)
假设CPU至少在某种程度上有所涉及,那么每个硬件处理器需要一个任务处理器。
每个处理器锁定一组活动类,在队列前面啜饮一堆作业,这些作业可以在当前设置状态下运行,在集合中标记为正在使用,解锁集合和队列,以及进程
每个slurp有多少个工作因作业率,处理器数量以及它们的聚集和延迟敏感程度而异。
饥饿应该是不可能的,因为一旦课程可以自由处理,未被篡改的元素应该是高度的。
批量工作以保持设置和队列争用率低:理想情况下,根据争用,空闲和延迟信息动态更改批量大小。
这使得开销保持与处理器数量成比例,而不是任务类数量。