--pipe
은 비효율적입니다 (측정하는 척도가 아니지만 시스템에 어떤 것이 잘못되었습니다). 1GB/s (총)의 순서로 제공 할 수 있습니다.
--pipepart
은 반대로 매우 효율적입니다. 디스크가 충분히 빠르면 코어 당 1GB/s의 속도로 제공 할 수 있습니다. 이것은 가장 효율적인 처리 방법 인 data.txt1
이어야합니다. 그것은 CPU 코어 당 하나 개의 블록으로의 data.txt1
을 분할하고 각각의 코어에서 실행되는 wc -l
에 그 블록을 공급한다 :
parallel --block -1 --pipepart -a data.txt1 wc -l
당신은 20,161,222 이상
block -1
가 작동하려면 버전이 필요합니다.
이것은 이전 듀얼 코어 노트북의 타이밍입니다.seq 200000000
은 1.8GB의 데이터를 생성합니다.
$ time seq 200000000 | LANG=C wc -c
1888888898
real 0m7.072s
user 0m3.612s
sys 0m2.444s
$ time seq 200000000 | parallel --pipe LANG=C wc -c | awk '{s+=$1} END {print s}'
1888888898
real 1m28.101s
user 0m25.892s
sys 0m40.672s
여기 시간은 각 1메가바이트 블록에 대한 새로운 wc -c
을 산란 병렬 GNU에 주로 기인한다. 블록 크기를 늘리면 더 빨리한다 :
$ seq 200000000 > data.txt1
$ time parallel --block -1 --pipepart -a data.txt1 LANG=C wc -c | awk '{s+=$1} END {print s}'
1888888898
real 0m2.242s
user 0m0.424s
sys 0m2.880s
그래서 내 옛날 노트북에 나는 2.2 초에서 1.8 GB를 처리 할 수 있습니다 :
$ time seq 200000000 | parallel --block 10m --pipe LANG=C wc -c | awk '{s+=$1} END {print s}'
1888888898
real 0m26.269s
user 0m8.988s
sys 0m11.920s
$ time seq 200000000 | parallel --block 30m --pipe LANG=C wc -c | awk '{s+=$1} END {print s}'
1888888898
real 0m21.628s
user 0m7.636s
sys 0m9.516s
으로는 파일에 데이터가있는 경우 --pipepart
빨리 많이 언급했다.
코어가 하나만 있고 작업이 CPU에 종속적이면 병렬 처리가 도움이되지 않습니다. 단일 코어 머신에서 병렬 처리는 대부분의 시간이 대기 (예 : 네트워크 대기)에 소비되면 의미가 있습니다.
그러나 컴퓨터의 타이밍에 따라 뭔가 잘못되었다고합니다. 다른 컴퓨터에서 프로그램을 테스트 해 보길 권합니다.
우리에게 액세스 권한을 부여 할 수있는 data.txt1을 사용하도록 예제를 변경할 수 있습니까? 귀하의시기는 매우 극단적이므로, 귀하가 운영하는 기계에 대해 더 많이 알아야합니다. –
@OleTange - 요청한대로 파일 데이터의 논리를 첨부했으며이 명령을 개발 한 사람입니까? –
나는 저자 다. 컴퓨터와 다른 컴퓨터에서 아래에 나와있는 테스트를 시도해야합니다. 나는 네 컴퓨터가 어떻게 든 부서 졌다고 생각해. –