使用最少的批次发送不同大小的文档

时间:2018-04-19 15:57:21

标签: java algorithm

这里有点有趣。

我们有一个系统可以获取有关一堆文档的元数据,其中一个是其大小。为了减少处理任何给定请求所需的时间,我们希望将这些文档拆分为最多10MB的请求批次。

目前我只是迭代列表并将大小添加到一个值,然后在该值达到10MB后,我们在前一个文档中切断批处理,然后继续。

然而,在这种情况下,由于文件的顺序,我们最终会得到超小批量。例如:
Doc 1:1MB
Doc 2:10MB
Doc 3:1MB

在这种情况下,我们最终得到3个请求,因为1MB + 10MB超过了上限,所以我们在文档1中删除了第一个请求。然后10MB + 1 MB再次超过了上限,所以我们在文档中删除了第二个请求2.

有没有办法查看一组值并查看是否有更好的方法将它们拆分,以便批次更少但批次保持在一定的上限?我想我在这里接近一个经典算法问题的方法,只是不确定这是否是一个解决的问题。

1 个答案:

答案 0 :(得分:1)

您可以使用https://docs.oracle.com/javase/7/docs/api/java/util/PriorityQueue.html获取Java中的优先级队列。因此,我们可以将batches作为批处理的优先级队列,使用我称之为batches.pop()的方法轻松获得最少的完整批处理,并且可以添加batches.add(...)批处理。有了它,这里是伪代码,为您的问题提供了良好的启发式。

Initialize empty batches data structure
batches.add(new Batch())

Sort documents from largest to smallest

for each document in documents:
    batch = batches.pop()
    if batch.size() + document.size() < cap:
        batch.add(document)
        batches.add(batch)
    else:
        batches.add(batch)
        newBatch = new Batch()
        newBatch.add(document)
        batches.add(newBatch)

while not batches.isEmpty():
    send batches.pop()