1메가 이상의 스트링 처리에 관해...

HiHi의 이미지

안녕하세요~

음, Linux 환경에서 C로 프로래밍을 하고 있는데,
가변적인 스트링처리 때문에 질문을 드리려 합니다.

char *test( char *mess )
{
    // mess의 길이는 알수가 없고,
    // 1 byte 에서 1 Mbyte 까지 다양합니다.
    ...
}

mess를 파싱할 버퍼를 할당해야 하는데,
속도를 우선시 하자니,
임의로 배열선언( char tmpBuf[1024*1024] )을 해야하는데,
메모리의 오버헤드가 너무 클것같고,
mess의 길이 만큼 동적할당(malloc:heap)을 하자니
CPU 오버헤드가 클것 같고...

임의 배열과, 동적 할당중 어떤게 좋을까요?
조언 부탁드립니다.
아~, test는 굉장히 자주 호출됩니다.

mach의 이미지

HiHi wrote:
안녕하세요~

음, Linux 환경에서 C로 프로래밍을 하고 있는데,
가변적인 스트링처리 때문에 질문을 드리려 합니다.

char *test( char *mess )
{
    // mess의 길이는 알수가 없고,
    // 1 byte 에서 1 Mbyte 까지 다양합니다.
    ...
}

mess를 파싱할 버퍼를 할당해야 하는데,
속도를 우선시 하자니,
임의로 배열선언( char tmpBuf[1024*1024] )을 해야하는데,
메모리의 오버헤드가 너무 클것같고,
mess의 길이 만큼 동적할당(malloc:heap)을 하자니
CPU 오버헤드가 클것 같고...

임의 배열과, 동적 할당중 어떤게 좋을까요?
조언 부탁드립니다.
아~, test는 굉장히 자주 호출됩니다.


요즘 메모리 별로 비싸지 않던데요!

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

Necromancer의 이미지

mmap() 시스템 콜을 써보시죠
MAP_ANONYMOUS로 하거나
/dev/zero에다 대고 걸어버리면 됩니다.

단 페이지 단위(x86이면 4kb)로만 할당되므로 여기에 대해 잘 처리하시길..

자주 호출된다면... 한번에 대량으로 할당받고 일부를 쪼개 나눠주는 방법을
쓸 수도... 아니면 아예 malloc()을 직접 구현하시던지.

해제는 munmap()입니다.

Written By the Black Knight of Destruction

ㅡ,.ㅡ;;의 이미지

HiHi wrote:
안녕하세요~

음, Linux 환경에서 C로 프로래밍을 하고 있는데,
가변적인 스트링처리 때문에 질문을 드리려 합니다.

char *test( char *mess )
{
    // mess의 길이는 알수가 없고,
    // 1 byte 에서 1 Mbyte 까지 다양합니다.
    ...
}

mess를 파싱할 버퍼를 할당해야 하는데,
속도를 우선시 하자니,
임의로 배열선언( char tmpBuf[1024*1024] )을 해야하는데,
메모리의 오버헤드가 너무 클것같고,
mess의 길이 만큼 동적할당(malloc:heap)을 하자니
CPU 오버헤드가 클것 같고...

임의 배열과, 동적 할당중 어떤게 좋을까요?
조언 부탁드립니다.
아~, test는 굉장히 자주 호출됩니다.

굉장히 자주호출된고 속도도 빨라야 하고 메모리도 절약하고 싶으면..
tmpbuf 를 작게 잡아 두시면 되겠네요..
받드시 입력데이터를 함수내부변수에 다담아두고 시작하라는법은 없지요.
조금씩받아서 하면되는것이지요..

혹시리턴 포인터가 입력받은 메모리영역과 다른곳을 설정해야할필요가 있다면
메모리할당 하시는게 좋지요..

--근데 이거 비슷한거 제가 아는사람이 한번묻던데..ㅡㅡ;; --


----------------------------------------------------------------------------

HiHi의 이미지

답변 감사합니다~~
^^

^^

댓글 달기

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