728x90

스트림을 활용한 병렬 데이터 처리

8.1 동시성 vs 병렬성

  • 동시성(concurrency)은 여러 작업이 중복되는 시간 동안 한정된 리소스에 대한 경쟁을 하면서 실행되는 것을 의미합니다.
  • 병렬성(parallelism)은 중첩된 작업들을 관리하는 것이 아니라 이 작업들이 동시에 실행되는 것에 중점을 준다.

즉 동시성은 동시에 실행 되는 것처럼 보이는 것일 뿐이며, 병렬성은 실제로 동시에 작업하는 것을 뜻한다.

8.2 병렬 함수 파이프라인으로써의 스트림

  • 병렬 스트림은 재귀적 분해(Recursive Decomposition) 개념을 사용합니다. 이는 요소를 Spliterator를 사용하여 분할하고 요소의 덩어리를 병렬로 처리함으로써 데이터 소스를 분할하고 정복하는 것을 의미합니다.

8.4 병렬 스트림 활용 시기와 주의할 점

  • 병렬과 순차 데이터 처리 방식 중 어떤 것을 선택할지에 대한 절대적인 기준은 없습니다.

적절한 데이터 소스 선택하기

  • 병렬 스트림에서는 데이터 소스가 여러 부분으로 나눠진다.
  • 테이터 소스의 특성상 작업이 균등하게 분배되지 않을 수 있다.
  • 병렬 처리에 유리하고, 비용이 적게들 수도 있지만 경우에 따라 복잡하고 많은 비용이 사용될 수 있는 과정을 데이터 소스 분해라고 한다.

요소의 개수

  • N은 요소의 수를, Q는 단일 작업에 소요되는 비용을 의미한다. N과 Q의 곲인 N * Q는 병렬 처리로 속도를 얼마나 향상시킬 수 있을지 가능성을 나타내는 지표가 된다.
  • 요소의 수가 많을수록 병렬 처리의 효과가 두드러진다.

스트림 연산

순수한 람다

  • 스트림 연산에서 사용되는 람다 표현식은 항상 순수해야 한다.
  • 지역 외부 상태와 관련된 주요 문제를 줄이기 위해 캡처된 변수들은 반드시 effectively final이어야 한다.
  • effectively final이란 한 번 할당된 이후에 다시 할당되지 않는 변수를 의미한다.실제로 문제가 되는 것은 스레드 지역 외부의 상태가 변경될 때 발생하므로..

병렬 처리에 적합한 연산

  • 직관적인 방법은 스트림의 요소에 대한 접촉 순서에 의존하는 정도를 알아보는 것.

Reduce vs Collect

  • 두 연산 모두 요소들을 축소하는 연산
  • 함수형 프로그래밍의 관점에서 보면 폴드 연산ㅇ느 여러 요소들에 함수를 적용하여 그 결과를 재귀적으로 합쳐서 반환값을 생성
  • 두 연산의 주요 차이점은 이러한 결과를 합치는 방식에서 발생
반응형
코드플리