복붙노트

[SCALA] 스칼라에서 반복자를 병렬

SCALA

스칼라에서 반복자를 병렬

완전히 미리 평가하지 않고 Iterator를 병렬화 스칼라의 병렬 컬렉션을 사용하여, 어떻게 든 수 있습니까?

여기, 즉지도 및 flatMap, 반복자의 기능 변환을 병렬화에 대해 이야기하고있다. 나는이 사전에 반복자의 일부 요소를 평가하고, 일부는 다음을 통해 소모되면 다음 더 많은 계산이 필요합니다 생각합니다.

나는 반복자를 필요로 찾을 수있는 모든 최선의에서의 Iterable 또는 스트림으로 변환 할 수 있습니다. 나는 그것에에서 .par 호출 할 때 스트림은 완전히 평가를 가져옵니다.

이 쉽게 사용할 수없는 경우 또한 구현의 제안을 환영합니다. 구현은 병렬지도와 flatMap을 지원해야한다.

해결법

  1. ==============================

    1.나는이 오래된 질문이지만, iterata 라이브러리에서 ParIterator 구현 당신이 찾고 있던 무엇을합니까 실현?

    나는이 오래된 질문이지만, iterata 라이브러리에서 ParIterator 구현 당신이 찾고 있던 무엇을합니까 실현?

    scala> import com.timgroup.iterata.ParIterator.Implicits._
    scala> val it = (1 to 100000).toIterator.par().map(n => (n + 1, Thread.currentThread.getId))
    scala> it.map(_._2).toSet.size
    res2: Int = 8 // addition was distributed over 8 threads
    
  2. ==============================

    2.표준 라이브러리에 가장 좋은 방법은 아마도 병렬 컬렉션하지만 concurrent.Future.traverse를 사용하지 않는 :

    표준 라이브러리에 가장 좋은 방법은 아마도 병렬 컬렉션하지만 concurrent.Future.traverse를 사용하지 않는 :

    import concurrent._
    import ExecutionContext.Implicits.global
    Future.traverse(Iterator(1,2,3))(i => Future{ i*i })
    

    나는이 즉시이 할 수있는 시작하는 모든 일을 실행할 것이라고 생각하지만.

  3. ==============================

    3.우도에서 병렬 반복자 요소 이송 :

    우도에서 병렬 반복자 요소 이송 :

    https://groups.google.com/d/msg/scala-user/q2NVdE6MAGE/KnutOq3iT3IJ

    나는 비슷한 이유로 Future.traverse 떨어져 움직였다. 내 사용 사례를 들어, 작업 N 작업을 유지, 내가 작업 대기열에서 실행 컨텍스트를 공급 스로틀에 코드와 상처.

    내 첫 번째 시도는 피더 스레드를 차단 참여하지만 실행 컨텍스트에 알 작업에 원도 차단 작업을 걸고. 당신이 알고 무엇을 차단 악이다.

  4. ==============================

    4.그것은 당신이 계신 정확히 따라 조금 어렵지만, 아마도 이런 식의 일 :

    그것은 당신이 계신 정확히 따라 조금 어렵지만, 아마도 이런 식의 일 :

    val f = (x: Int) => x + 1
    val s = (0 to 9).toStream map f splitAt(6) match { 
      case (left, right) => left.par; right 
    }
    

    이는 병렬로 상기 제 6 개 요소 (F)를 평가 한 다음, 나머지 위에 스트림을 리턴한다.

  5. from https://stackoverflow.com/questions/17178201/parallel-iterator-in-scala by cc-by-sa and MIT license