gpt4 book ai didi

java - 将一个spliterator拆分成N个spliterator

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:10:50 25 4
gpt4 key购买 nike

在分析一位同事几年前的 Java 7 代码时,我发现他实现了一个可能并行遍历数据的实用程序。他称之为Range,它扩展了Iterator接口(interface)。它的一些新方法令人尴尬地熟悉:

  • int size() 会给出范围的确切大小;
  • Range split() 会将范围分成 2 部分,虽然不一定,但最好是大小相似(修改当前范围并创建新范围);
  • Range[] split(int n) 会将范围分成 N 个子范围,可能会尝试使它们尽可能均匀。
  • 尽管 void remove() 是来自 Iterator 的,但它的子类型只是抛出 UnsupportedOperationException

我对自己说的是,这绝对是我们现在可以使用(小型)拆分器做的事情,从而利用流 API。但是,Java 8 中的拆分器并未提供拆分成 n 部分的简单方法。

使用递归函数,我们可以将其拆分为 n = 2^L 部分,具有 L 递归级别,但是当 n 不是二的幂,更不用说仅仅为了效果而保留效用函数感觉很不自然。

有人可能还会说简单地避免乱用拆分器,让流在实际处理过程中进行 fork 引起的拆分,但是 ForkJoin 策略可能不太适合该任务,并且不能保证它会使用我们特别希望专用于该作业的线程数。事实上,可能存在对少量元素执行繁重任务的情况。

问题总结如下:有一个至少具有 SIZED 和 SUBSIZED 特征的拆分器,我怎样才能将它拆分为准确数量的拆分器?

最佳答案

实现它的方法是编写一个拆分器 wrapper,它使用自己的拆分策略,这甚至不是那么复杂,并且可以与现有的 F/J 支持框架进行互操作。您失去的是利用 native 随机访问结构的能力;您只能通过迭代内部 splitetator 的数据集来拆分。

可以引用我的earlier answer我在这里展示了分成预定大小的批处理的代码;只需适当的构造函数调用,就可以很容易地使其适应您的情况。

关于java - 将一个spliterator拆分成N个spliterator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28716001/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com