Multithreading 有向图中数据处理的线程模型
我将设计一个简单的数据分析工具,通过有向图处理不同类型的数据。有向图在某种程度上可以由用户自定义。每个节点将包括对通过的数据进行记录、分析和数学运算。该图在许多方面与神经网络相似,只是每个节点都有额外的处理。一些节点对通过的数据元素执行简单的操作,而其他节点有复杂的算法 如何在这个有向图中执行多线程处理,以便以最快和最有效的方式从图中获得结果?内存不是问题,初始化此任务所需的时间也不是问题 我想到了两种不同的方法来多线程工作:Multithreading 有向图中数据处理的线程模型,multithreading,graph-theory,directed-graph,Multithreading,Graph Theory,Directed Graph,我将设计一个简单的数据分析工具,通过有向图处理不同类型的数据。有向图在某种程度上可以由用户自定义。每个节点将包括对通过的数据进行记录、分析和数学运算。该图在许多方面与神经网络相似,只是每个节点都有额外的处理。一些节点对通过的数据元素执行简单的操作,而其他节点有复杂的算法 如何在这个有向图中执行多线程处理,以便以最快和最有效的方式从图中获得结果?内存不是问题,初始化此任务所需的时间也不是问题 我想到了两种不同的方法来多线程工作: 每个线程实例“跟随”进入此图中开始节点的每个数据元素。当数据元素通
- 每个线程实例“跟随”进入此图中开始节点的每个数据元素。当数据元素通过每个节点时,线程将与该数据元素保持在一起,在树的整个过程中调用每个节点上的处理方法。这基本上需要每个进入系统的数据元素有一个线程。当然,一旦数据元素通过整个系统,线程将被回收。这里的问题是当一个节点上存在两个传出边缘时——线程需要同时跟随这两个边缘(这是否意味着从线程池中提取一个新线程?)
- 为每个节点创建一个线程,并在每个图边上创建一个数据缓冲区。节点上的工作线程将持续检查以在一个线程处理数据的时间较长的实例中保存数据。这种方法的问题是缓冲区固有的“轮询”,以便有足够的数据开始处理它——这可能是简化任何图形配置的数据流的一个小代价
Brett首先,产生无限数量的线程(例如每个节点的线程)不是一个好主意。通常,您希望的线程数最多为CPU内核的1.5-3倍(例如,四核处理器的线程数为6-12) 我建议使用。在这种情况下,您的问题可以重新表述为任务的大小 你提到的两种方法都是有效的,每种方法都有其优缺点 每个数据输入一个任务应该很容易实现,因为图形处理的算法将保持单线程。上下文切换、同步和线程间数据传递的开销几乎为零 当一个节点上有两条传出边时,此单个任务必须同时跟随这两条边。这是所有图形遍历算法的标准部分,例如or 如果图形有多个可并行处理的“分支”,则每个图形节点一个任务可以改善延迟。然而,这种方法需要更复杂的图形处理设计,线程同步的开销也会更高。实际上,多线程的成本可能高于并行处理图形所获得的好处 当一个节点上有两个传出边缘时,可以创建两个新任务,然后在线程池上排队。(或将一个任务排队,然后继续处理另一个任务。) 更困难的问题是当节点上有两条传入边时。处理节点的任务将不得不等待,直到两条边的数据都可用
结论:我个人会从第一个选项(每个数据输入一个任务)开始,看看你能做多少。好答案祝贺你。思考一下这个问题,是否有可能以某种方式将指定的分支添加到线程中?因此,如果我们有两个输出,我们将产生两个线程。通过这种方式,如果存在节点(节点线)的连续连接,则可以对其进行优化。如果图中有很多不同的分支(最坏的情况),我们可以对线程使用FIFO,并通过节点逐个运行。我们可以将同时线程的运行限制在上面建议的数量。