멀티 코어에 해당하는 '| uniq-c|' 명령

멀티 코어에 해당하는 '| uniq-c|' 명령

'|' sort | sort -n' 명령과 동일한 기본 멀티 코어가 있는지 묻고 싶습니다.

나는 내가 사용할 수 있다는 것을 안다다음과 같은프로그램

split -l5000000 data.tsv '_tmp';
ls -1 _tmp* | while read FILE; do sort $FILE -o $FILE & done;
sort -m _tmp* -o data.tsv.sorted

그런데 맛이 좀 과하네요.

답변1

GNU에는 다음과 같은 플래그 sort가 있습니다 --parallel.

sort --parallel=8 data.tsv | uniq -c | sort --parallel=8 -n

이는 8개의 동시 프로세스/스레드를 사용하여 두 가지 정렬 단계를 각각 완료합니다. 부품 uniq -c은 여전히 ​​단일 프로세스를 사용합니다.

Stéphane Chazelas가 의견에서 지적했듯이 GNU 구현은 sort이미 병렬화되어 있으므로(POSIX 스레드를 사용함) 코어 수보다 많거나 적은 스레드를 사용하려는 경우에만 동시 스레드를 수정하면 됩니다.

sort이 단계로 인해 두 번째 단계에서는 첫 번째 단계보다 훨씬 적은 양의 데이터를 얻게 되므로 uniq훨씬 더 빨라질 것입니다.

--buffer-size=SIZEsum 을 사용하여 정렬 속도를 높일 수도 있습니다 --batch-size=NMERGE. sort설명서 를 참조하세요 .

정렬 속도를 더욱 높이려면 임시 파일을 빠른 파일 시스템에 기록해야 합니다 sort(여러 유형의 저장소가 연결된 경우). TMPDIR해당 마운트 지점에서 쓰기 가능한 디렉터리 경로에 환경 변수를 설정하거나 를 사용하여 이를 sort -T directory수행 할 수 있습니다.

답변2

나에게는 이것이 더 빠르다. YMMV(중복 항목 수에 따라 다릅니다):

parallel --lb --pipepart --block 15m -a /tmp/big.file 'sort | uniq -c' |
  awk '{ count[$2] += $1 } END { for(elem in count) print count[elem], elem }' |
  sort -n

관련 정보