우리 스크립트 중 하나는 두 파일의 내용을 다른 파일에 쓰는 것이며 다음 명령은 4분이 걸립니다. 파일 1에는 헤더 레코드가 있고 파일 2에는 4GB의 데이터가 있습니다. 파일 3에서는 헤더 레코드가 맨 위에 있어야 하고 그 뒤에 파일 2의 내용이 와야 합니다.
4분 안에 이를 달성할 수 있는 더 좋은 방법이 있습니까?
cat file1 file2 > file3
감사합니다 라구
답변1
몇 번의 로컬 테스트만으로 이 sed h file >> destination
명령은 약 66% 더 빠르며, 단일 파일 인수만 허용되므로 cat
두 번째 명령을 추가하기 위해 스크립트를 약간 다시 작성해야 sed
하지만 어느 쪽이든 여전히 더 빠릅니다.
편집: 명령을 통해 측정된 4GB 임의의 텍스트 파일과 유니코드 문자 시간을 사용하여 테스트되었습니다 time
.
답변2
내 오래된 노트북의 하드 드라이브는 당신의 하드 드라이브보다 약 두 배나 빨랐습니다.
최적화된 독립 실행형 고양이가 아닌 BusyBox에서 고양이를 실행하고 있는 것 같습니다.
4개의 명령의 타이밍을 확인했는데 모두 대략 동일한 결과(10% 이내)를 나타냈습니다. 저는 GNU cat, sed, awk, dd를 사용했습니다. 각 테스트 전에 캐시를 지웠습니다(다른 창에서 sudo로)
echo 3 > /proc/sys/vm/drop_caches
.
sed는 (btw) 여러 입력 파일을 처리합니다.
$ time cat Timer1 Timer2 > Timer3
real 1m57.536s
user 0m0.072s
sys 0m20.456s
$
$ time sed -e '1n' Timer1 Timer2 > Timer3
real 1m54.450s
user 0m15.924s
sys 0m23.420s
$
$ time awk 1 Timer1 Timer2 > Timer3
real 2m0.080s
user 0m21.752s
sys 0m21.444s
$
$ time { cat Timer1 > Timer3
> dd status=none conv=notrunc oflag=append bs=100M if=Timer2 of=Timer3
> }
$
real 2m9.426s
user 0m0.012s
sys 0m18.260s
$
$ ls -lh Timer?
-rw-r--r-- 1 paul paul 17 Mar 7 11:01 Timer1
-rw-r--r-- 1 paul paul 3.7G Mar 7 11:03 Timer2
-rw-r--r-- 1 paul paul 3.7G Mar 7 11:50 Timer3
$
$ ls -l Timer?
-rw-r--r-- 1 paul paul 17 Mar 7 11:01 Timer1
-rw-r--r-- 1 paul paul 3942530050 Mar 7 11:03 Timer2
-rw-r--r-- 1 paul paul 3942530067 Mar 7 12:06 Timer3
이는 타이밍이 주로 I/O 성능에 의해 결정되고 사용되는 명령이 덜 중요하다는 것을 보여줍니다. (쉘 읽기 루프를 사용하는 것은 여전히 좋은 생각이 아닙니다.)
그러나 cat과 dd는 편집 도구보다 사용자 시간을 훨씬 적게 사용한다는 점은 주목할 가치가 있습니다.