如何在偶数块中拆分数组以进行并行处理

时间:2014-11-02 06:00:52

标签: arrays multithreading algorithm

我有大量的发票数据按发票日期排序。我想通过日期的某些功能来总结数据,例如:按月,季度等。 由于数组非常大,我想利用多线程,并在不同的线程中并行处理数组的几个部分。

我正在寻找一种算法将数组拆分为N个块,尽可能大小相似,条件是数据中没有两个元素,日期转换函数会产生相同的结果两个不同的块。

因此,例如,如果我选择按月对其进行分区,则所有2014年11月的发票将由同一个帖子处理。

我只是想知道这是一个已知的名称问题,已经存在一个算法,这将使我免于重新发明轮子。

1 个答案:

答案 0 :(得分:2)

对于您的情况(和ANY),多个线程可能会或可能不会加速您的应用程序。这取决于众多因素。

话虽如此,一个常见的模式是拥有一堆worker threads in a pool

伪代码应该是这样的:

while your array is not empty 
  if there is at least one idle worker
    pick one idle thread and process element 0 from the array
    Remove element 0 from the array
    Process the element
  else wait for a worker thread to be idle

我不会因为月份或类似情况而烦恼,因为它导致了其他问题,即你有几个月没有数据或数月有大量数据会扭曲并行性。

如果您真的想要排序,那么您的工作线程可以在正确的位置插入已处理的数据。但是请注意同步。如果你有一个运行上面的线程,你是正确的,但如果多个线程试图插入到“结果数组”中,那么你需要在插入之前锁定它

根据您的评论进行修改:

如果你真的想避免同步并认为让所有线程都写入同一个数组(某些语言可能不允许这样,真的不确定),那么将所有数据放在一个数组中,将数组拆分为N等于M长度的块。使用NxM存储桶创建结果数组,然后当您有空闲工作程序启动时,为其分配第N个块和第N个存储桶。

在执行结束时,您的数据将被分类并连续