跨多个线程按大小分配文件以平衡工作负载

时间:2013-03-28 11:45:31

标签: java

我被问到以下

There are X number of compressed files of different sizes in a single folder.
Where X is 1 to 250.
File size ranges from 1MB to 65MB. The compression ratio varies from 9 to 11.

There are Y number of parser threads. Where Y is between 1 to 8.

Write an application that distributes the files so each thread receives the same amount of data ( or as close as possible ).
Please follow all best coding practices and standards you are familiar with.

For example

If X is 5 and Y is 3 and the files are
File 1 is 1MB, File 2 is 2MB, File 3 is 3MB, File 4 = 4MB, File 5 = 5MB.

Uncompressed File 1,2,5 = compressed file * 9. Files 3,4 = compressed file * 10

Output
Thread <thread number> = Files <file number...> = <total size of all files uncompressed>
...
Data skew = ((max size - min size) / max size ) * 100

我是否正确地认为这是一个不可能回答的问题,看起来很模糊。在我看来,这是一个非常难以在1小时内回答的问题。

我认为这种分配是非常重要的。


修改

我所知道的问题是上面所说的。

对我而言,这似乎是一个非常含糊的问题。

1 个答案:

答案 0 :(得分:0)

所以,根据我的评论,我认为这是传统Bin Packing Problem的一个实例,除了在这种情况下,你有一定数量的箱子(线程)提前知道并且箱子可以增长,这需要一些计算。可以把它想象成有X个盒子,你必须填充Y个项目,但盒子可以更高。

首先,我认为您需要预先计算未压缩的文件大小。未压缩的文件大小类似于bin打包问题中的“卷”。

接下来,我认为您可以根据未压缩的值对文件进行排序。这样可以更快地搜索列表。

为了实际将它们分类,请将bins视为bin包装问题中的“bins”。我认为有很多方法可以做到这一点,在我确定一个特定方法之前我会遇到的一个问题是:你是否更关心首先使用所有线程,但是让它们彼此接近彼此大小可能,或者你是否更关心如何尽可能接近结果尺寸,你只是不能使用超过规定的线程?

如果关注的是使用所有线程,我认为我的方法看起来像:

  1. 从最大的文件开始,填充垃圾箱,使它们尽可能小。继续这样做,直到你不能再插入任何垃圾箱而不超过最大垃圾箱(文件中包含最大文件的垃圾箱)。
  2. 将最小的物品放在最小的箱子里。这是你新的“水印”
  3. 与步骤1一样,将最大的文件放在可以接受它的最大容器中,而不会越过水印。继续这样做,直到你用完文件或者你不能再超过。如果是前者,你的完成,如果是阶梯,则回到第2步。
  4. 如果关注的是大小匹配,那么我的方法会有些不同。

    1. 将最大的项目放在最小的bin中。这是你的“水印”。把它放在一边
    2. 抓住最小的垃圾箱。这是你当前的工作箱。
    3. 找到适合您正在使用的垃圾箱的下一个最大的物品,而不会超过“水印”。
    4. 重复#3,直至无法填充当前垃圾箱
    5. 将最小的文件放在最小的bin中。这是你的新“水印”
    6. 仅限#2
    7. 这里的好处是我认为你会得到一个非常均匀的分布,因为你总是保持“箱子”尽可能接近彼此的大小。问题是它关注箱子的大小而不是全部使用它们。