대용량[수백메가~수기가] 텍스트 파일 처리..

ninenon의 이미지

unix계열에서 수백MB~ 수GB 정도되는 대용량 텍스트 파일 처리할때
어떤 방식이 효율적일까요?

파일 저장 방식은

여러개의 레코드가 한파일에 저장된 형태이구요
레코드 중간에 특정 필드의 값을 검색(strstr, strcmp)해서 동일할경우 해당 레코드 전체를
뽑아 내야 합니다.

레코드들의 사이즈는 제각각이구요

일단 가장 간단한 방법으로 파일 앞부터 한줄씩 쭈욱 읽는 방식으로 해보니
당연히 레코드가 파일에 뒤쪽에 있을때는..
영~~~ 오래걸리더군요..

해서 쓰레드를 한 10개정도 생성해서
하나의 파일을 쓰레드 10개가 각각 파일의 1/10 씩 담당하여
동일 기능을 수행하는 방식으로 해볼까 하는데
이럴 경우 주의할점(lock, thread 동기화)이나 혹은
보다 효율적인 방법이 없을까요?

aero의 이미지

Wide Finder Project와 유사한 작업을 하시네요.
Perl이 Wide Finder Project에서 Ruby와 Erlang 등을 꺾고 정상에 섰다.
를 참고하시면 도움이 되실겁니다.

wkpark의 이미지

미친듯이 빠른 속도란 말이 넘 재밌네요 ㅎ 그런데 여기서 perl이 php보다 40배나 빠르다니;;; 후아..

온갖 참된 삶은 만남이다 --Martin Buber

lordmiss의 이미지

php나 ruby 같은 경우에는 거의 최적화가 전혀 없던데요... perl이나 erlang의 경우에는 고심한 흔적들이 많이 보이지만요... 40배는 공정한 비교는 아닌거 같네요.


http://lordmiss.com
DDD, BMDRC

aero의 이미지

Perl이 저렇게 빠르게 될 수 있었던 이유는
Sys::Mmap 이라는 모듈을 사용하여 파일을 메모리상에 올리고 빠른 문자열처리 능력을 이용해서 성능을 극대화 시켰기 때문입니다.

Perl로 했다고 하지만 Sys::Mmap모듈이 내부적으로 C프로그램을 컴파일 하여 인터페이싱해서 사용하는 일명 XS모듈이기 때문에 Pure Perl이라고는 말하기 힘들죠.

다른 스크립트 언어들도 그러한 컴파일된 C루틴과 인터페이싱되는 모듈들을 사용하면 더 빨라질 수 있을겁니다.

하지만 중요한건 Perl은 다른 스크립트 언어들과는 달리 누구나 동일하고 표준적인 방법으로 Sys::Mmap이라는 모듈을 CPAN을 통해 쉽게 설치해서 편리하게 사용할 수 있도록 제공한다는 점입니다. CPAN은 Perl과 뗄래야 뗄 수 없고 Perl의 한 부분으로 인식되고 있기 때문에 저러한 식으로 처리하는걸 편법이라고 하지는 못하는거지요.

뭐 순위야 자신이 선호하는 언어가 순위에서 밀리는것이 못마땅한 사람들이 최적화해서 덤벼들면 바뀔 수 도 있겠지요.

ninenon의 이미지

결과를 보니 좀 놀랍네요.. ㄷㄷㄷ;;

연구좀 해봐야 겠네요.. ^^

ssggkim의 이미지

대용량 텍스트 파일 처리라... 흥미롭군요.
좀더 자세한 내용이 있는 곳은 없을까요? :)

ssggkim의 이미지

어이쿠 aero님 글에 답변 단다는게 잘못달았네요.
댓글 삭제 기능은 없는건가요? ^^

aero의 이미지

제가 글에 모두 링크를 걸어놓지 않았나요?

각 프로그램 소스는 결과 리포팅 페이지에 Notes라는 컬럼의 작성자 이름을 클릭하면
나옵니다.

ssggkim의 이미지

아... 올려주신 링크는 감사하게 잘 보았습니다.
혹시 비슷한 주제의 다른 정보도 있으신가 해서요. 재미있는 주제같아서요. :)

jick의 이미지

10분의 1씩 나눠서 한다고 해도 "재수없는 위치"에 걸리면 늦게 찾는 건 달라지지 않죠. 단지 그 재수없는 위치가 파일의 90%~99%쯤 대신 파일의 9%, 19%, 29%... 이런 위치가 된다는 차이가 있죠.

메모리가 충분히 커서 파일이 메인 메모리의 disk cache에 다 올라온다면 모를까, 그렇지 않다면 10분의 1씩 나눠서 하면 오히려 훨씬 느려질 것 같습니다. 왜냐 하면 기존에는 파일을 처음부터 끝까지 죽~ 한번 읽으면 되니까 sequential read인데 이제는 열 개의 쓰레드가 각각 자기가 담당한 부분을 읽으려고 하니까 디스크 헤드가 미친듯이 파일 앞뒤를 왔다갔다 하게 되거든요. 서로 발목을 잡고 넘어지는 꼴이죠.

Multiprocessor 환경의 이점을 최대한 살리고 싶다면 하나의 read 전담 쓰레드가 파일을 순서대로 읽은 다음, CPU 갯수만큼의 processing thread가 있어서 read thread가 얘들한테 이미 읽은 부분을 적절히 잘라 나눠주는 형태로 가는 게 좋을 것 같습니다. (Read thread는 어차피 디스크에서 읽기만 하기 때문에 CPU는 거의 안 쓰고, 실제 검색을 하는 쓰레드들이 CPU를 하나씩 잡고 쓰겠죠.)

ninenon의 이미지

실제로 구현을 해보니.. 말씀하신 "재수없는 위치" 경우가 생기더라구요.
CPU 100%를 한녀석에게 할당하며 돌릴수도 없는 장비라서.. 난감하기두 했구요

처음 질문 내용에는 간단하게 적었지만.
예외처리도 많고 첨부터 C로 짜여진 프로그램에 덧붙인 추가개발작업이라서
C로 짜기 시작했는데.. 연구해보고 스크립트 써보는 것도 괜찮을거 같네요..

답변 감사합니다.

다즐링의 이미지

1회용이 아니라면..

인덱스를 생성하심이 =3

-------------------------------------------------------------------------------------------------------
Life ... http://iz4u.net/blog/

------------------------------------------------------------------------------------------------
Life is in 다즐링

mach의 이미지

한 표!

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.