我有大量的发票数据按发票日期排序。我想通过日期的某些功能来总结数据,例如:按月,季度等。 由于数组非常大,我想利用多线程,并在不同的线程中并行处理数组的几个部分。
我正在寻找一种算法将数组拆分为N个块,尽可能大小相似,条件是数据中没有两个元素,日期转换函数会产生相同的结果两个不同的块。
因此,例如,如果我选择按月对其进行分区,则所有2014年11月的发票将由同一个帖子处理。
我只是想知道这是一个已知的名称问题,已经存在一个算法,这将使我免于重新发明轮子。
答案 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个存储桶。
在执行结束时,您的数据将被分类并连续