bash 쉘 스크립트 질문

hoolaboy의 이미지

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 입니다.

왜 그럴까요?

woonuk의 이미지

catfile() 함수 부분에서 for문을 없애고 다음처럼 처리하면 어떤가요?

catfile()
{
    echo ${inline[@]}
}
hoolaboy의 이미지

감사합니다.
배열의 내용이 한번에 다 나와서 빠르긴 하지만, 원래 텍스트에 있던 \n가 없어지고 한줄로 나오는군요.
이러면 줄 단위로 처리를 하는 원래 스크팁트가 동작 하지 않습니다.
@, * 모두 해봤습니다만, 마찬가지 입니다.

doodoo의 이미지

어디서 들었는지 기억이 나질 않아서 카더라 통신이 되긴 하지만
read 쓰면 느리답니다....그래서 그렇게 알고 있습니다.

koseph의 이미지

Perl을 쓰시는 게 정신건강에 이롭습니다.

간단한 업무라면 몇 줄에 끝날 수도 있습니다.

이번 기회에 펄로 전향해 보시는 것도 어떠실지........
---------------------------------
There's always another way, dear.

---------------------------------
There's always another way, dear.

cinsk의 이미지

원하는 것이 shell의 메모리에 파일의 내용을 모두 저장하는 것이라면, 위 코드에는 큰 문제가 없어보입니다.

그런데, 왜 파일의 내용을 모두 shell에 저장하는 것인지?

--
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://www.cinsk.org/cfaqs/

hoolaboy의 이미지

본 스크립트 안에서 하나의 파일에 대해 여러번 grep, sort, uniq, sed등 텍스트 처리를 반복해야 합니다. 이따 마다 cat 등으로 파일을 직접 읽기 보다는 스크립트 초기에 한번만 그 내용을 메모리에 올려놓고 처리가 필요할 때 마다 메모리에서 읽는게 더 빠르다고 생각했습니다. 그런데 오히려 1분 걸리던 작업이 3-4분으로 더 느려졌네요.

sephiron의 이미지

bash 배열보다 디스크 캐쉬의 효율이 월등해서 그럴겁니다. text가 6만 라인이면 실제 사이즈는 얼마 되지 않을테니까 디스크 캐쉬의 효율이 훨씬 좋다고 봐야죠.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.