当前位置: 首页 > 知识库问答 >
问题:

将一个分路器拆分为 N 个分路器

阳文轩
2023-03-14

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

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

我对自己说的是,这绝对是我们现在可以用(子化的)拆分器做的事情,从而利用stream API。然而,Java 8中的spliterator并没有提供一种简单的方法来分割成n个部分。

使用递归函数,我们可以将其拆分为具有L递归级别的n=2^L部分,但当n不是2的幂时,这种方法就不那么微不足道了,更不用说仅仅为了效果而保留实用函数感觉不自然了。

也可以简单地说,为了避免与拆分器混淆,让流在实际处理过程中执行由fork引起的拆分,但是ForkJoin策略可能不太适合任务,并且不能保证它将使用我们特别希望专用于该任务的线程数。事实上,可能会出现在少数元素上执行繁重任务的情况。

问题总结如下:拥有一个至少具有SIZE和SUBSIZE特征的分路器,我如何将其拆分为确切数量的分路器?

共有2个答案

劳豪
2023-03-14

"...但是ForkJoin策略可能不足以完成任务”

对我来说,这听起来像是过早的优化。您希望手动实现复杂的事情,因为现有策略可能不足...

“…并且不保证它将使用我们特别希望专用于该作业的线程数。”

确实没有保证,但是当前的流实现使用公共的Fork/Join池,该池可以被配置成期望的线程数量。将指定数量的线程用于任务正是您所要求的策略。

“事实上,可能会有在少数元素上执行繁重任务的情况。”

我看不出与F/J框架的工作方式有任何矛盾。它将尝试分割,直到达到所需的并行度。如果这意味着每个线程只处理一个项目,那也可以。

在这一点上,值得注意的是,与内核数量相匹配的默认并行度对于任何不涉及阻塞的计算任务来说都是足够的,无论处理单个项目需要多长时间。只要每个线程都有自己的工作负载,就不可能有超过实际硬件执行单元数量的加速。

换句话说,F/J框架实现了您想要自己实现的策略(或者比您要实现的策略更好的策略),这将我们带回到第一点,过早优化。

谢俊英
2023-03-14

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

您可以参考我之前的答案,其中我展示了分成预定大小批次的代码;只需适当的构造函数调用即可使其适应您的情况。

 类似资料:
  • 问题内容: 想象一下,我有一个这样的JS数组: 我想要的是将该数组拆分为N个较小的数组。例如: 对于Python,我有这个: 对于JS,我可以提出的最佳解决方案是递归函数,但我不喜欢它,因为它既复杂又丑陋。这个内部函数返回一个像这样的数组[1,2,3,null,4,5,6,null,7,8],然后我必须再次循环并手动拆分它。(我的第一次尝试是返回此:[1、2、3,[4、5、6,[7、8、9]]],

  • 问题内容: 我有一个表字段,其中包含用户的姓氏和名字。是否有可能分裂成那些2场,? 所有记录的格式均为“名字的姓氏”(不带引号,中间还有空格)。 问题答案: 不幸的是,MySQL没有分割字符串功能。但是,您可以为此创建一个用户定义的函数,例如以下文章中描述的函数: Federico Cargnelutti撰写的MySQL Split String Function 使用该功能: 您将可以按照以下方

  • 问题内容: 我有从mongodb导出的json文件,如下所示: 大约有30000行,我想将每一行拆分成自己的文件。 (我正在尝试将我的数据转移到榻榻米群集上) 我尝试这样做: 但是我发现它似乎减少了行的负载,而当我期望30000个奇数时,运行此命令的输出仅给了我50个奇数文件! 有没有一种逻辑方法可以使此操作不使用任何适合的方法删除任何数据? 问题答案: 假设您不在乎确切的文件名,如果要将输入拆分

  • 问题内容: 将Spring的配置拆分为多个xml文件的正确方法是什么? 此刻我有 /WEB-INF/foo-servlet.xml /WEB-INF/foo-service.xml /WEB-INF/foo-persistence.xml 我有以下内容: 实际问题: 这种方法正确/最佳吗? 我真的需要同时指定中的配置位置 和该板块? 我需要记住什么才能能够引用中定义的?这与 指定有关吗? 更新1:

  • 问题内容: 我的体积太大了,很难找到正确的视图。 如何将其拆分为多个文件,然后导入?是否涉及速度损失? 我可以这样吗? 问题答案: 在Django中,所有内容都是Python模块(* .py)。你可以创建一个具有内部视图的文件夹,并且仍然可以导入视图,因为这也实现了Python模块。但是一个例子会更好。 你的原始图片可能如下所示: 使用以下文件夹/文件结构,它将起到相同的作用: viewsa.py

  • 问题内容: 我正在尝试将我的应用拆分为几个文件: 我的第一个猜测是这样做: 这不起作用,然后我发现了这个问题,但是在此解决方案中,我仍然遇到问题,当我运行时,出现类似以下内容: 我对此不太确定,但我担心有关该部分的内容 : 这是我的model1.py文件: 这是我的model3.py文件: 显然可以,但是我收到了评论,如果我尝试执行此操作,则会发生相同的事情: 因此,我应该手动运行alter fo