두 파일의 내용을 다른 파일에 쓰기

두 파일의 내용을 다른 파일에 쓰기

우리 스크립트 중 하나는 두 파일의 내용을 다른 파일에 쓰는 것이며 다음 명령은 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는 편집 도구보다 사용자 시간을 훨씬 적게 사용한다는 점은 주목할 가치가 있습니다.

관련 정보