mapPartitions
을 RDD에 적용하면 파티션에 반복 가능한 개체가 생성됩니다. 그런 다음 mapPartitions
함수 내에서 iterable 객체의 toArray
멤버 함수를 호출하여 반복 가능한 객체를 Array 객체로 변환합니다. toArray
을 호출하는 것은 복사를 포함합니까, 아니면 그냥 배열과 같은 메모리 부분을 참조하기 시작합니까? 복사가 필요한 경우 복사를 방지하는 방법은 무엇입니까?반복 가능한 배열과 스파크의 배열
4
A
답변
3
질문에 대한 중요한 수정 - mapPartitions
동안 노출 된 파티션 데이터 구조는 반복기가 아니고 반복 가능합니다.
Iterator
가 한 번 컬렉션의 각 요소를 방문 허용next()
및hasNext()
방법을 가지고 다음은 인터페이스 차이입니다. 반복자의 메서드가 호출되면 마지막 요소는 없어집니다 (변수에 저장하지 않은 경우).Iterable
에는 원할 때마다Iterator
을 생성 할 수있는 기능이 있습니다. 이렇게하면 각 요소를 원하는만큼 여러 번 방문 할 수 있습니다.
구현면에서 Iterator
은 데이터를 스트리밍 할 수 있습니다. next()
이 호출 될 때 실제로로드되는 한 번에 하나의 요소 만 메모리에 있어야합니다. Spark (sc.textFile
)을 사용하여 텍스트 파일을 읽는다면 정확하게이 작업을 수행하고 파티션을 통해 간단한 반복 작업을 수행하는 데 거의 메모리를 사용하지 않습니다.
iterator.toArray
으로 전화 할 수는 있지만 반드시 원하지 않을 수 있습니다. 결국 모든 데이터를 메모리에 저장하게됩니다 (한번에 한 번에 하나의 요소 만로드 할 수 있기 때문에 Spark에서는 한 번에 모든 요소를로드 할 수 없으며 각 데이터를 복사합니다 (Int
과 같은 프리미티브의 경우).) 또는 각 데이터 조각에 대해 새 참조를 할당하십시오 (AnyRef
의 경우, Array[_]
과 같음). 이 복사를 방지 할 수있는 방법은 없습니다.
파티션 반복자를 배열로 변환하는 작업이 원하는 경우이지만 이러한 사용 사례는 드뭅니다. 메모리가 부족하고 불필요한 할당 및 GC로 인해 응용 프로그램의 실행 속도가 느려질 수 있으므로 실제로 필요한지 여부에 대해 열심히 생각하십시오!
관련 문제
- 1. 배열과 객체 배열 배열
- 2. jQuery를 사용하여 배열과 배열 사이에서 반복 된 값을 제거하는 방법
- 3. 반복 가능한 범위에서 반복
- 4. 각형 객체 배열과 열 배열
- 5. 배열 배열과 반환 값
- 6. 포인터 배열과 다차원 배열
- 7. 정수 배열과 문자 배열
- 8. 숫자 배열과 이름 배열
- 9. 배열과 복사 배열
- 10. 다차원 배열과 객체 배열
- 11. 스칼라를 사용하여 스파크의 배열 배열 내의 구조체에서 값 추출
- 12. 배열 문자열의 반복 반복
- 13. MIPS 배열 반복 표기법?
- 14. 배열과 배열 배열 간의 차이점을 찾는 방법
- 15. 두 번째 배열과 일치하는 배열 다차원 배열
- 16. 플렉스에서 배열과 배열 콜렉션의 차이점
- 17. 다른 배열과 관련된 배열 정렬
- 18. ArrayList 배열과 동일한 Algo로 배열
- 19. 배열을 배열 배열과 구별하는 방법
- 20. 루비 : 나는 배열과 같이이 배열
- 21. 상수 배열과 객체 배열 비교
- 22. 배열과 비교 하나 개 배열
- 23. 지그재그 형 배열과 다차원 배열
- 24. 배열 반복
- 25. 배열 반복
- 26. 배열 내의 배열 배열을 다른 배열 배열 배열과 비교합니다.
- 27. 각도 반복 : 배열과 컬렉션을 검색하는 방법
- 28. go, 배열 반복 반복 중
- 29. 반복 가능한 인터페이스 구현
- 30. 반복 가능한 개체 재설정
다음 질문은 반복자가 한 번에 하나의 요소가 아닌 특정 수의 요소를 가져올 수 있습니까? – pythonic
이 작업을 수행하기 위해 미리 빌드 할 수있는 것은 없지만 'Iterator 확장'을 작성하고 마지막 'n'요소를 추적 할 수 있습니다. 영감을 얻으 려한다면'iterator.buffered'를 보자 : 다음 요소를 지우지 않고 다음 요소를 들여다 볼 수있는'BufferedIterator'가 생성된다. – Tim
아마도'iterator.grouped (size)'를 원할 것이다. 이것은 당신에게 주어진 크기의'Seq'에 대한 반복자를 줄 것이다. –