Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.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 scala中的并行流_Java_Scala - Fatal编程技术网

Java scala中的并行流

Java scala中的并行流,java,scala,Java,Scala,有没有(希望是现成的)方法来并行遍历Scala流 例如,请参见以下java 8代码: String[] s = {"a","b","c","d","e"}; List<String> list = Arrays.asList(s); list.parallelStream().forEach(System.out::println); 将输出如下内容: 1过滤器a 1过滤器b 2过滤器->b 1过滤器c 1过滤器d 2过滤器->d 另一方面,下面的代码将分块处理数据。在每次转换时将

有没有(希望是现成的)方法来并行遍历Scala流

例如,请参见以下java 8代码:

String[] s = {"a","b","c","d","e"};
List<String> list = Arrays.asList(s);
list.parallelStream().forEach(System.out::println);
将输出如下内容:

1过滤器a

1过滤器b

2过滤器->b

1过滤器c

1过滤器d

2过滤器->d

另一方面,下面的代码将分块处理数据。在每次转换时将变量保留在内存中:

  "abcd".toVector.par.filter { x => 
  println(s"1 filter $x")  
   if(x.toInt%2==0) true;else false;
  } //end of first block
  .foreach { x => 
  println(s"2 filter->$x")  
  } //end of second block
输出: 1过滤器c

1过滤器a

1过滤器b

1过滤器d

2过滤器->b

2过滤器->d

您可以使用

你可以用

许多(大多数?)Scala集合都有一个
par
方法,该方法“返回此集合的并行实现”

从ScalaDocs:

对于大多数集合类型,此方法通过复制所有元素来创建新的并行集合。对于这些集合,
par
需要线性时间

Scala
Stream[]
没有直接的并行实现,因此您得到的是
ParSeq[]
,并且由于
ParSeq
是一种特性,REPL将它实例化为
ParVector

scala> Stream("a","b","c","d","e").par
res0: scala.collection.parallel.immutable.ParSeq[String] = ParVector(a, b, c, d, e)
同样值得注意的是ScalaDocs中的其他信息:

传递给某些操作的高阶函数可能包含副作用。由于批量操作的实现可能不是连续的,这意味着副作用可能是不可预测的,如果不小心,可能会产生数据争用、死锁或状态无效。在访问可变数据时,程序员要么避免使用副作用,要么使用某种形式的同步

因此,您的
foreach(println)
代码可能会产生不可预测/不希望的结果。

许多(大多数?)Scala集合都有一个
par
方法,该方法“返回此集合的并行实现”

从ScalaDocs:

对于大多数集合类型,此方法通过复制所有元素来创建新的并行集合。对于这些集合,
par
需要线性时间

Scala
Stream[]
没有直接的并行实现,因此您得到的是
ParSeq[]
,并且由于
ParSeq
是一种特性,REPL将它实例化为
ParVector

scala> Stream("a","b","c","d","e").par
res0: scala.collection.parallel.immutable.ParSeq[String] = ParVector(a, b, c, d, e)
同样值得注意的是ScalaDocs中的其他信息:

传递给某些操作的高阶函数可能包含副作用。由于批量操作的实现可能不是连续的,这意味着副作用可能是不可预测的,如果不小心,可能会产生数据争用、死锁或状态无效。在访问可变数据时,程序员要么避免使用副作用,要么使用某种形式的同步


因此,您的
foreach(println)
代码可能会产生不可预测的/不希望的结果。

目前,我知道有两种可能是值得追求的

当然,假设您在JVM上运行Scala,您应该能够直接使用Java8流API


或者,我认为您可以调查ApacheSpark。我只是开始对此进行修补,但正如我所理解的,虽然它的大部分功能来自于跨多台机器的切分工作,但它仍然提供了一种并行执行模式,即使是在一台机器上。就设计而言,这似乎是一个“类固醇流”的东西,如果数据源允许的话,它似乎会带来惰性。我将自己进一步研究这个问题,所以任何更新都会引起我的兴趣

目前,我意识到有两种可能是有益的

当然,假设您在JVM上运行Scala,您应该能够直接使用Java8流API


或者,我认为您可以调查ApacheSpark。我只是开始对此进行修补,但正如我所理解的,虽然它的大部分功能来自于跨多台机器的切分工作,但它仍然提供了一种并行执行模式,即使是在一台机器上。就设计而言,这似乎是一个“类固醇流”的东西,如果数据源允许的话,它似乎会带来惰性。我将自己进一步研究这个问题,所以任何更新都会引起我的兴趣(A' to ' e ')。@evan.oman我认为当前的任何答案都不能解决这个问题,但ParVector的行为不像jdk8流:cbut ParVector的行为与jdk8流不同:C
scala> Stream("a","b","c","d","e").par
res0: scala.collection.parallel.immutable.ParSeq[String] = ParVector(a, b, c, d, e)