다만 아쉬운 점이라고 한다면, 병렬 처리 자체가 정렬을 지원하지 않기 때문에, 정렬된 순서대로 결과가 나오지 않는다는 단점이 있습니다.
.NET에는 .asParallel() 외에 .asOrdered() 가 있어, 병렬 처리를 하면서 정렬된 결과를 얻을 수 있습니다.
Scala에서는 아쉽게 지원되지 않으므로, 한 번 더 처리 해 줘야 합니다.
다음과 같이 처리해야 할 정보를 받아 mapper 함수를 이용하여 작업을 처리한다고 한다면, 단순히 map(mapper(_) 만 수행하면 되겠지만, 정렬을 수행하기 위해, 입력 변수도 같이 저장하여, 정렬을 수행할 수 있도록 한 후, 정렬 후에 Tuple에서 원하는 결과만 빼서 전달하는 것입니다.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
def mapAsOrdered[T <: Ordered[T], V](items: Iterable[T], mapper: T => V): Iterable[V] = { | |
items.par | |
.map(item => (item, mapper(item))) | |
.toList.sortWith(_._1 < _._1) | |
.map(_._2) | |
} |
뭐 입력 자체가 정렬이 안된 경우도 있을 수 있고, 입력값 자체가 map 형태라면 좀 달라져야 하지만, 유사한 로직으로 해결이 가능할 것입니다.
Java로도 유사한 코드를 만들 수 있지만, Scala 가 더 편하네요^^
댓글 없음:
댓글 쓰기