bash 쉘 스크립트 질문
글쓴이: hoolaboy / 작성시간: 목, 2009/08/06 - 5:22오후
Quote:
업무 처리에 필요한 스크립트를 만들다가 생긴 궁금증 입니다.
한 파일에 대해 여러번 grep으로 패턴을 찾아야 합니다. 텍스트 파일 크기는 대략
40000~60000라인 정도 입니다. 너무 스크립트가 느려서 bash array에 내용을
저장하여 쓰면 어떨까 해서 다음과 같은 함수를 만들었습니다.loadfile() { inputfile=$1 zz=1 while read line do inline[$zz]=$line zz=$((zz+1)) done < $inputfile } catfile() { for ((i=1;i<${#inline[@]};i++)) do echo ${inline[$i]} done }
본 스크립트 안에서는 loadfile 을 한번만 하고 나머지 grep이 필요할 때는
catfile 을 이용 합니다.
그런데, 왠지 그냥 단순히 cat file|grep 등을 이용하는 것보다 2-3배 더
느리네요. 어디서 이렇게 느려지는지 살펴보니 catfile 입니다.왜 그럴까요?
Forums:
catfile() 함수
catfile() 함수 부분에서 for문을 없애고 다음처럼 처리하면 어떤가요?
감사
감사합니다.
배열의 내용이 한번에 다 나와서 빠르긴 하지만, 원래 텍스트에 있던 \n가 없어지고 한줄로 나오는군요.
이러면 줄 단위로 처리를 하는 원래 스크팁트가 동작 하지 않습니다.
@, * 모두 해봤습니다만, 마찬가지 입니다.
어디서 들었는지
어디서 들었는지 기억이 나질 않아서 카더라 통신이 되긴 하지만
read 쓰면 느리답니다....그래서 그렇게 알고 있습니다.
패턴과 관련한 일이라면.......
Perl을 쓰시는 게 정신건강에 이롭습니다.
간단한 업무라면 몇 줄에 끝날 수도 있습니다.
이번 기회에 펄로 전향해 보시는 것도 어떠실지........
---------------------------------
There's always another way, dear.
---------------------------------
There's always another way, dear.
원하는 것이 shell의
원하는 것이 shell의 메모리에 파일의 내용을 모두 저장하는 것이라면, 위 코드에는 큰 문제가 없어보입니다.
그런데, 왜 파일의 내용을 모두 shell에 저장하는 것인지?
--
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://www.cinsk.org/cfaqs/
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
이유
본 스크립트 안에서 하나의 파일에 대해 여러번 grep, sort, uniq, sed등 텍스트 처리를 반복해야 합니다. 이따 마다 cat 등으로 파일을 직접 읽기 보다는 스크립트 초기에 한번만 그 내용을 메모리에 올려놓고 처리가 필요할 때 마다 메모리에서 읽는게 더 빠르다고 생각했습니다. 그런데 오히려 1분 걸리던 작업이 3-4분으로 더 느려졌네요.
bash 배열보다 디스크
bash 배열보다 디스크 캐쉬의 효율이 월등해서 그럴겁니다. text가 6만 라인이면 실제 사이즈는 얼마 되지 않을테니까 디스크 캐쉬의 효율이 훨씬 좋다고 봐야죠.
댓글 달기