这里有点有趣。
我们有一个系统可以获取有关一堆文档的元数据,其中一个是其大小。为了减少处理任何给定请求所需的时间,我们希望将这些文档拆分为最多10MB的请求批次。
目前我只是迭代列表并将大小添加到一个值,然后在该值达到10MB后,我们在前一个文档中切断批处理,然后继续。
然而,在这种情况下,由于文件的顺序,我们最终会得到超小批量。例如:
Doc 1:1MB
Doc 2:10MB
Doc 3:1MB
在这种情况下,我们最终得到3个请求,因为1MB + 10MB超过了上限,所以我们在文档1中删除了第一个请求。然后10MB + 1 MB再次超过了上限,所以我们在文档中删除了第二个请求2.
有没有办法查看一组值并查看是否有更好的方法将它们拆分,以便批次更少但批次保持在一定的上限?我想我在这里接近一个经典算法问题的方法,只是不确定这是否是一个解决的问题。
答案 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()