问题标签 [spliterator]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
223 浏览

java - 拆分器并行排序顺序

我正在实现一个分页拆分器(在 Java 中),它应该允许并行访问。

我有以下测试用例(测试是在带有 Spock 的 Groovy 中):

此测试用例失败并出现以下错误:

分离器有characteristics()

当我不使用并行时,代码有效。所以我不明白ORDERED

  • 如果设置了,流框架是否应该保证顺序并且在使用并行生成的块时应该对结果进行排序?如果是,为什么不对我的情况进行排序?
  • 还是我的trySplit实施中有错误,必须按照给定的顺序拆分?(目前我在打开的页面中间拆分,0-mid 停留在当前拆分器,中间进入新创建的拆分器)
  • 还是我应该先打电话sort()collect()因为框架根本不保证任何顺序?

--- 根据反馈进行更新 ---

感谢您的回答,我的代码中有两个逻辑错误。首先是请求的片段:

第一个错误:

新创建的 Spliterator 设置为后半范围而不是第一个。我在文档中阅读了有关前缀的信息,但对我来说感觉很笨拙。我以页面大小拆分以具有多个并行请求。在开始时(第一个拆分器实例),我必须获取第一页以获取页面和元素计数器。因此,为了解决顺序问题,我必须将从第一个拆分器获取的数据分发给第二个拆分器以遵守顺序,这对我来说感觉很奇怪且不直观。

第二个错误:

所有后续创建的拆分器都将收到来自框架的一个estimateSize()和一个trySplit()调用。目前在此调用期间,我获取了一个页面,但这会阻止并行性,获取必须在tryAdvance()调用的后期进行。

我将实施此更改,然后再回复您。

0 投票
1 回答
646 浏览

java - Java Spliterator:如何平等地处理大型 Stream 拆分?

我正在使用的代码

输出

我的问题/问题: 第一个 trySplit(以及未来的任务“future-0”)正好得到 n/2 个总元素来开始处理。前几次拆分需要很长时间才能完成——随着 n 的增长,情况会变得更糟。有没有其他方法来处理一个流,其中每个未来/可调用对象都获得相等的元素分布来处理,例如 (N/splits) 即。1000000/20 = 50000

期望的结果

后续问题:如果 Spliterator 无法做到这一点,那么最好使用其他方法/解决方案来同时处理大型流。

实际案例场景:处理太大而无法保存在内存中的大型 (6GB) CSV 文件

0 投票
1 回答
222 浏览

java - 分隔符跳过部分文本

我正面临流dropWhiletakeWhile方法的问题,因为拆分器正在以奇数或偶数的特定模式跳过部分文本。应该如何处理文本的所有部分?我的方法在这里:

样本输入为:

它将跳过 FAYSAL: 2 和 FAYSAL: 4

0 投票
3 回答
376 浏览

java - 如何从java中的拆分器返回下一个元素

我想从拆分器中获取下一个元素,而不仅仅是对下一个元素“执行操作”。例如通过实现以下方法

我发现的所有搜索结果都说 tryAdvance() 就像迭代器 hasNext() 和 next() 的组合,除了这是一个大谎言,因为我无法获取下一个元素,只是“对下一个元素执行操作”。

0 投票
1 回答
115 浏览

java - 修改后的基础集合上的拆分器

我知道这绝不应该在生产中发生,但我试图了解有关 Spliterators 的一些复杂细节,并遇到了以下“谜题”(至少对我来说是一个谜题):

(片段 1)

这段代码按预期打印456123咳嗽我已经预料到了ConcurrentModificationException,但我理解咳嗽的行为),即它在列表上创建了一个Spliterator,当列表有6个元素时,它将被拆分,等等。到目前为止一切都很好.

我不明白的是:

(片段 2)

我希望这段代码会失败,并且它确实会失败,但它也会打印到输出上ConcurrentModificationException。如果将其更改为,则会看到值和以各自的顺序放在异常之前。s1.forEachRemaining34System.err::println34PrintStream

现在疯狂的部分:

(片段 3)

请注意,片段 2 和 3 之间的唯一变化是我们访问s1和的顺序s2。代码段 3 仍然失败ConcurrentModificationException,但打印的值为12。这是因为异常现在发生在s2.forEachRemaining!

如果我理解正确,会发生什么:

  • Spliterator 已初始化
  • 拆分完成
  • 迭代发生
    • 迭代期间,观察到在最后一次拆分完成,基础集合发生了修改

这是否意味着 Spliterators 也像 Streams 一样“懒惰”?但是,在尝试多个拆分时,这个论点并没有真正成立,即

(片段 4)

然后应该评估s1没有问题并在处理过程中抛出异常s2,但它在处理过程中已经抛出异常s1

任何帮助或指针表示赞赏。

详细信息:如果重要的话,我在 Eclipse 2019-06 (4.12.0) 的 Windows 上的 AdoptOpenJDK 11.0.4+11(64 位)上运行代码片段。

0 投票
3 回答
395 浏览

java - 您可以重新平衡未知大小的不平衡拆分器吗?

我想使用 aStream来并行处理一组异构的远程存储的未知数量的 JSON 文件(文件的数量是未知的)。这些文件的大小差异很大,从每个文件 1 条 JSON 记录到其他一些文件中的 100,000 条记录。在这种情况下, JSON 记录意味着一个自包含的 JSON 对象,表示为文件中的一行。

我真的很想为此使用 Streams,所以我实现了这个Spliterator

我遇到的问题是,虽然 Stream 一开始可以很好地并行化,但最终最大的文件会在单个线程中处理。我相信近端原因有据可查:分离器是“不平衡的”。

更具体地说,似乎trySplit在 的生命周期中的某个时间点之后不会调用该方法Stream.forEach,因此在末尾分发小批量的额外逻辑trySplit很少执行。

请注意从 trySplit 返回的所有拆分器如何共享相同的paths迭代器。我认为这是一种非常聪明的方法来平衡所有拆分器的工作,但它还不足以实现完全并行。

我希望首先跨文件进行并行处理,然后当仍然有少数大文件处于拆分状态时,我想跨剩余文件的块进行并行处理。那是else块末尾的意图trySplit

是否有解决此问题的简单/简单/规范的方法?

0 投票
2 回答
344 浏览

java - 为什么 Hashmap.values().parallelStream() 不能并行运行,而将它们包装在 ArrayList 中可以工作?

hashmap 有两个键值对,它们不会被不同的线程并行处理。

输出:

网址:https ://ideone.com/Hkxkoz

ValueSpliterator 应该尝试将 HashMap 的数组拆分为大小为 1 的插槽,这意味着两个元素应该在不同的线程中处理。

来源:https : //www.codota.com/code/java/methods/java8.util.HMSpliterators $ValueSpliterator/%3Cinit%3E

将它们包裹起来后ArrayList,它按预期工作。

输出:

0 投票
2 回答
293 浏览

java - java中多个json到xml的高效处理

我需要处理存储在一个文件中的多个 json 并将它们转换为 xml。这些 json 平均会转换成 3000 行 xml(以获得 json 大小的图片)。我希望在不到半小时的时间内实现这一目标。

时间包括从文件中读取,遍历和转换,并再次以 xml 的形式存储到另一个文件中。稍后我还需要将它们存储在数据库中。我还没有这样做,但我打算使用 Kafka 连接器直接插入数据库以实现性能。

我面临的问题是:- - 我只能从输入文本文件中读取一行,但不能读取多行。- 如何在我的 SpliteratorBenchmark.processLine() 方法中使用我的实用程序,该方法接受要转换的字符串。- 每次创建新的 xml 文件时如何创建新的 xml 文件。我有一个包含多个 json 的文件。我应该读取一行并将其转换为 xml,然后为下一个 json 转换另一个 xml。

请帮忙。

有没有其他方法可以实现这一点。我不能使用任何类型的 JMS,如 MQ 或 Kafka 来完成这项任务。

这是我的核心 FixedBatchSpliteratorBase:-

这是我的班级 FixedBatchSpliterator:-

这是我的 JsonSpliterator:-

这是我的主要类,它读取输入文件并开始转换过程:-

这就是我计划将我的 json 转换为 xml 的方式:-

这是我调用这个 Util 类来转换的类:-

0 投票
1 回答
89 浏览

java - 实现 Comparator 的类在探测 spliterator().getComparator 时会产生 IllegalStateException

我有以下课程

现在我的理解是,下面的代码应该产生一些类名或 null 但不是 IllegalStateException,如 java 文档中所述

如果此 Spliterator 的源由 Comparator 排序,则返回该 Comparator。如果源按自然顺序排序,则返回 null。否则,如果源未排序,则抛出 IllegalStateException。

编辑 2

我相信我无法让您了解我在寻找什么。以此为例:

这输出为

现在 Collections.reverseOrder() 只是 Comparator 的一个实现

由于这产生了正确的答案,我对我的代码的期望也是它应该输出一个像上面这样的类名。

那么我做错了什么?

0 投票
1 回答
390 浏览

java - 在 Java 中将拆分器转换为列表的最佳习语是什么?

我想在 Java 中将a 转换Spliterator<T>为 a 。List<T>

最好的成语是什么?我目前正在使用以下代码:

有没有更简单/更快的方法?