我知道尝试使并行流以特定顺序执行每个元素是没有意义的。由于它并行运行数据,因此排序中显然会有一些不确定性。但是,我想知道是否有可能让它按顺序执行“排序”,或者至少尝试保持顺序有点类似于如果它是顺序的。
用例
我需要对来自几个数组的值的每个组合执行一些代码。我创建了一个包含所有可能索引组合的流,如下所示(为了不泄露专有信息,变量的名称已被混淆,我保证我通常不会命名我的变量arr1等arr2):
public static void doMyComputation(double[] arr1, double[] arr2, double[] arr3) {
DoubleStream.of(arr1).mapToObj(Double::valueOf)
.flatMap(
i1->DoubleStream.of(arr2).mapToObj(Double::valueOf)
.flatMap(
i2->DoubleStream.of(arr3).mapToObj(Double::valueOf)
.flatMap(
i3->new Inputs(i1,i2,i3)
)
)
)
.parallel()
.forEach(input -> doComputationallyIntensiveThing(input.i1, input.i2, input.i3);
这很好用(或者至少真实版本可以,我为我在此处发布的代码片段简化了一些事情,所以我可能把代码片段弄乱了)。我希望由于并行性,我不会看到 order 中的值arr1[0], arr2[0], arr3[0],其次是arr1[0], arr2[0], arr3[1]等等。但是,我希望我至少会看到从arr1第一个开始的前几个值的输入,然后慢慢工作我走到尽头的路arr1。我惊讶地发现它甚至没有接近那个。
问题在于,在该doComputationallyIntensiveThing方法中,只有当我们同时看到许多相同的值时,才会有一些缓存表现良好arr1。如果这些值是完全随机输入的,那么缓存弊大于利。
有什么方法可以提示流以将输入按中的值组合在一起的顺序执行输入arr1?
如果没有,那么我可能只为每个值创建一个新流,arr1它会正常工作,但我想看看是否有一种方法可以在一个流中完成这一切。
智慧大石
偶然的你
相关分类