[완료]Perl (혹은 다른 script language) 에서 list append시 발생하는 비용 문제...

jekai의 이미지

안녕하세요, perl 관련 질문이 있어 글을 남깁니다. 고수님들 도와주세요 ㅠㅠ ( 여기는 매번 질문만 남기는 것 같네요...;;; )

지금 perl로 대용량 data를 다루는 프로그램을 간단히 만들고 있는데요,,
문제가 하나 생겨서 질문드립니다.

문제는 프로그램을 돌리다가 시간이 지날수록 느려지는 현상이 보여 나름 분석한 결과, 다음과 같은 결론을 내렸습니다.

data를 array(list)에 추가하는 작업이 있는데요, 초기에 추가할 data가 얼마되지않을때는 빠른거 같은데,

append를 계속 할 수록 프로그램 속도가 현저하게 느려지는 것 같습니다. (수만에서 수십, 수백만...)

이 이유를 처음에 한정된 메모리 공간에서 작업하다가 array size가 커질수록 memory allocation을 OS에 요청하는 일을 빈번하게 발생해서
'memory allocation' 이라는 추가비용때문에 프로그램이 느려지는 것이라고 보고 있습니다'

위의 이유는 나름 시뮬레이션한 결과 맞는것 같은데요,,

위와같은 문제를 해결할 방법으론 어떤게 있나요??

(보통 C++ STL같은 경우는 array에 대한 size가 모자랄 경우 현재 size x 2 만큼씩 늘려서 할당해주자나요)...

aero의 이미지

Perl도 배열의 갯수가 증가하면 C++ STL처럼 size가 모자랄 경우 현재 size x 2 만큼씩 늘려서 할당해줍니다.
Perl Array의 자세한 내부구조는 http://books.simon-cozens.org/index.php/Perl_5_Internals#Arrays 를 참조하시고

다음과 같은 배열변수에 push로 요소를 하나씩 넣는 예제코드를 실행시키면

#!/usr/bin/env perl
use strict;
use warnings;
use Devel::Peek;
 
my @array;
foreach ( 0 .. 15 ) {
    push @array ,$_;
    Dump( \@array );
    print STDERR "-"x12,"\n";
}

다음과 같이 Perl 배열 변수 내부구조를 보여주는데

SV = IV(0x15f6530) at 0x15f6538
  REFCNT = 1
  FLAGS = (TEMP,ROK)
  RV = 0x15f6cb8
  SV = PVAV(0x15d2fe0) at 0x15f6cb8
    REFCNT = 2
    FLAGS = (PADMY)
    ARRAY = 0x15f98e0
    FILL = 0
    MAX = 3
    ARYLEN = 0x0
    FLAGS = (REAL)
    Elt No. 0
    SV = IV(0x15d1f10) at 0x15d1f18
      REFCNT = 1
      FLAGS = (IOK,pIOK)
      IV = 0
------------
SV = IV(0x15f6548) at 0x15f6550
  REFCNT = 1
  FLAGS = (TEMP,ROK)
  RV = 0x15f6cb8
  SV = PVAV(0x15d2fe0) at 0x15f6cb8
    REFCNT = 2
    FLAGS = (PADMY)
    ARRAY = 0x15f98e0
    FILL = 1
    MAX = 3
    ARYLEN = 0x0
    FLAGS = (REAL)
    Elt No. 0
    SV = IV(0x15d1f10) at 0x15d1f18
      REFCNT = 1
      FLAGS = (IOK,pIOK)
      IV = 0
    Elt No. 1
    SV = IV(0x15f6530) at 0x15f6538
      REFCNT = 1
      FLAGS = (IOK,pIOK)
      IV = 1
------------
  .
  .
  .

위에서 FILL은 현재 배열내의 최대 인덱스이고 MAX는 메모리에 할당된 최대 배열의 싸이즈 입니다.
0에서 15까지 돌렸을때 각 FILL값과 MAX값은 다음과 같습니다.
0  3
1  3
2  3
3  3
4  5
5  5
6  13
7  13
8  13
9  13
10 13
11 13
12 13
13 13
14 29
15 29

이걸로 STL의 방식과 똑같이 동작하는 걸 볼 수 있습니다.( Perl에서 문자열 할당도 이와 같은 방식으로 동작함)

문제의 원인을 파악하려면 사용하시는 Perl버젼,운영체제,테스트한 컴퓨터의 메모리등 사양, 예제코드 같은 객관적 데이터가 더 있어야 할 것 같습니다.

Perl의 성능은
이번 11월1일 구글의 대항마로 불리며 오픈하여 이슈가되고 있는 http://blekko.com 에서도 기간 시스템언어로 사용되고
참고:
http://online.wsj.com/article/SB10001424052748704477904575586551374128996.html?mod=googlenews_wsj
http://news.ycombinator.com/item?id=926813

최근에 오픈한 The Lacuna Expanse( http://lacunaexpanse.com/ )라고 하는 월드당 10만 유저가 사용하는 웹기반 MMORPG게임에 사용될 만큼 웹 프론트엔드뿐만 아니라 뒷단의 기간시스템까지 아우르는 부분에서 까지 그 성능을 잘 발휘하고 있으니 그 부분은 걱정 안 하셔도 될 것 같네요.
참고:
http://www.perl.com/pub/2010/10/colonizing-the-lacuna-expanse-with-perl.html
http://www.madmongers.org/talks/the-lacuna-expanse

jekai의 이미지

앗, 정말 많은 도움되었습니다.
찾고 자료까지 정말 감사드리고요,,

감사합니다.

문제는 filesystem이 느려져서 그런거였더라고요;;;;

aero의 이미지

파일시스템이 느려졌다고 하면 물리적 메모리가 모자라서 swapping하는데 그 swap디스크가 느려서 그랬단 말이신가요?
Perl프로그램의 bottleneck을 찾으시려면
New York Times의 IT팀에서 만든 Devel::NYTProf 이라는 걸 사용해 보세요.
프로그램이 수행되면서 어디서 얼마만큼 시간을 잡아먹는지 아주 자세하고 예쁘게 분석해서 보여줍니다.

참고:
http://search.cpan.org/dist/Devel-NYTProf/
http://blog.timbunce.org/2008/07/15/nytprof-v2-a-major-advance-in-perl-profilers/
http://assets.en.oreilly.com/1/event/27/State-of-the-art%20Profiling%20with%20Devel__NYTProf%20Presentation.pdf

. . .

jekai의 이미지

감사합니다.

댓글 달기

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