Java 使用最少的批发送不同大小的文档
这里有点有趣 我们有一个系统,可以获取关于一堆文档的元数据,其中一部分是文档的大小。为了减少处理任何给定请求所需的时间,我们希望将这些文档拆分为最大10MB的请求批 目前,我只是迭代列表并将大小添加到一个值中,在该值达到10MB之后,我们在上一个文档中切断该批,然后继续 然而,在这种情况下,由于文档的顺序,我们最终可能会得到超小批量。示例:Java 使用最少的批发送不同大小的文档,java,algorithm,Java,Algorithm,这里有点有趣 我们有一个系统,可以获取关于一堆文档的元数据,其中一部分是文档的大小。为了减少处理任何给定请求所需的时间,我们希望将这些文档拆分为最大10MB的请求批 目前,我只是迭代列表并将大小添加到一个值中,在该值达到10MB之后,我们在上一个文档中切断该批,然后继续 然而,在这种情况下,由于文档的顺序,我们最终可能会得到超小批量。示例: 文档1:1MB 文档2:10MB 文档3:1MB 在本例中,我们最终得到了3个请求,因为1MB+10MB超出了上限,所以我们在文档1中削减了第一个请求。然后
文档1:1MB
文档2:10MB
文档3:1MB 在本例中,我们最终得到了3个请求,因为1MB+10MB超出了上限,所以我们在文档1中削减了第一个请求。然后10MB+1MB又超过了上限,所以我们在文档2中削减了第二个请求 是否有一种方法可以查看一组值,并查看是否有一种通常更好的方法来分割它们,从而减少批次,但批次保持在特定的上限下?我想我正在处理一个经典算法问题,只是不确定这是否是一个已解决的问题。您可以使用Java获得优先级队列。因此,我们可以将
批次
设置为批次的优先级队列,使用我将调用batches.pop()
的方法,可以轻松获得最少的完整批次,并且您可以使用批次添加批次。添加(…)
。有了这些,下面是一个伪代码,可以为您的问题提供一个很好的启发
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()
初始化空批数据结构
batches.add(新批处理())
将文档从最大到最小排序
对于文档中的每个文档:
batch=batches.pop()
如果batch.size()+document.size()
是否强制按顺序发送元数据?我想你只需要根据大小对列表进行排序。盒子包装/背包包装-这是这个经典问题的常见名称之一。搜索这个会带来很多启发式算法。@Andrew另一个关键字是bin packing。不,我们不需要按顺序发送元数据。我不确定基于大小的排序是否同样糟糕,因为我们遇到了一个问题,即我们根据他们自己的请求打包了5MB文档,即使它们可以与较小的文档配对。编写一个简单的mapReduce,将小于10MB的文档分为一个组,将大于10MB的文档分为另一个组,然后进行处理,这样你就可以避免小批量。我发现了。如果您使用它,您可以使用类似于batches.headMap(capacity-document.size()).lastKey()的东西来查找给定文档可以进入的最完整的批,而不仅仅是将其放入最空的批。这可能是一个明显更好的包装。然而,有许多复杂的问题需要解决,例如具有相同容量的多个批次。但这是一个更好的算法。