외부 멀티 스레딩 정렬을 구현해야합니다. 나는 멀티 스레딩 프로그래밍에 대한 경험이 없으며, 현재 알고리즘이 좋은지 아닌지 잘 모르겠다. 어떻게 완료해야할지 모르겠다. 내 생각은 다음과 같습니다외부 멀티 스레딩 정렬
- 스레드가 입력 파일에서 데이터의 다음 블록을 읽어
- 정렬 그것의 standart algorith에게 (표준 : : 일종)
- 난에있는이 후 다른 파일
에 기록을 사용하여 그러한 파일을 병합하십시오. 어떻게해야합니까? 병합 가 난 후 바로 종류의 파일을 병합하려고하면, 내가 피하기 위해 알고리즘을 마련 할 수
- 임시 파일을 많이받을 때까지
- 내가 전까지 입력 파일을 기다리면 완전히 처리됩니다 매우 다른 크기의 파일을 병합하는 경우 은 O (N^2) 난이도로 연결됩니다.
또한 나는 그러나 나는가 EnterNet 좋은 준비 알고리즘으로 찾을 수 없습니다, 이것은 매우 일반적인 작업입니다 가정합니다. 나는 특히 C++ 구현을 위해 그러한 링크에 대해 매우 감사하게 생각합니다.
Gnu 정렬 작업을 수행합니다. 메모리에 들어있는 데이터의 "덩어리"를 정렬하는 초기 패스의 멀티 스레딩은 각 덩어리에 대한 임시 파일을 만듭니다.초기 패스 후에는 병합 프로세스 (기본적으로 16 방향 병합)가 단일 스레드에서 수행됩니다. 이것은 많은 옵션을 가진 텍스트 파일 정렬이므로 다소 복잡합니다 : [gnu sort.c] (http://githu.com/goj/coreutils/blob/rm-d/src/sort.c). – rcgldr
감사합니다. 병합이 단일 스레드에서 수행 된 이유를 모르십니까? –
각 병합 단계는 16 개의 파일을 읽고 1 개의 파일을 쓰고 있으므로 프로세스는 단일 파일에 대한 I/O 바인딩이며 CPU에 바인딩되지 않습니다. OS 및 드라이브는 쓰기 (뒤 쓰기)를 버퍼링하므로 쓰기가 병합 프로세스와 효과적으로 겹칩니다. 병합 프로세스는 버퍼링으로 인해 평균적으로 쓰기에서 프로세스 입출력 경계를 유지하는 데 충분한 데이터를 생성하기 만하면되므로 병합 단계에 멀티 스레딩이 필요하지 않습니다. – rcgldr