Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用最少的批发送不同大小的文档_Java_Algorithm - Fatal编程技术网

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

Java 使用最少的批发送不同大小的文档,java,algorithm,Java,Algorithm,这里有点有趣 我们有一个系统,可以获取关于一堆文档的元数据,其中一部分是文档的大小。为了减少处理任何给定请求所需的时间,我们希望将这些文档拆分为最大10MB的请求批 目前,我只是迭代列表并将大小添加到一个值中,在该值达到10MB之后,我们在上一个文档中切断该批,然后继续 然而,在这种情况下,由于文档的顺序,我们最终可能会得到超小批量。示例: 文档1:1MB 文档2:10MB 文档3:1MB 在本例中,我们最终得到了3个请求,因为1MB+10MB超出了上限,所以我们在文档1中削减了第一个请求。然后

这里有点有趣

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

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

然而,在这种情况下,由于文档的顺序,我们最终可能会得到超小批量。示例:
文档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()的东西来查找给定文档可以进入的最完整的批,而不仅仅是将其放入最空的批。这可能是一个明显更好的包装。然而,有许多复杂的问题需要解决,例如具有相同容量的多个批次。但这是一个更好的算法。