대량의 파일내용을 받아 어떤 일정문자열과 비교하는 프로그램의 문제점.. 입니다 도와주세요~

stroma289의 이미지

500000개의 한줄의 문자열이 저장되어 있는 파일(파일의 내용은 규칙 없이 나열된 ACTGCTACGTAGCTACAGTCAGCTAGCTAGCT... 같이 AGCT 네개의 문자가 무작위로 나열된 문자열입니다.)을 받아 20개의 문자열을 500000개의 문자열과 어느정도 비슷한지 퍼센트를 구하는 간단한 프로그램을 만들었습니다.

#include <stdio.h>
#include <string.h>
#define MAX_size 500001
 
int main(void){
        int i, h, l, per;
        FILE *fp;
 
        char ref[MAX_size];
 
        fp=fopen("ref.txt", "r");
        fscanf(fp, "%s", &ref[0]);
 
        int ref_len=strlen(ref);
 
        char pri[]="CATGAACATGCATGCATCACGT";
        int pri_len=strlen(pri);
 
        l=ref_len-pri_len+1;
        char ref_arr[l][pri_len];
 
        for(h=0; h<l; h++){
                int j=0;
                for(i=h; i<pri_len+h; i++){
                        ref_arr[h][j]=ref[i];
                        j++;
                }
        }
 
        for(h=0; h<l; h++){
                int co=0;
                for(i=0; i<pri_len; i++){
                        printf("%c", ref_arr[h][i]);
                        if(ref_arr[h][i] == pri[i]){
                                co++;
                        }
                }
                per=100*co/pri_len;
                printf(" %d", per);
                printf("\n");
        }
        return 0;
}

결과는
~~~~~~~(중략)~~~~~~~
ATTTTTGAAAGCTCCACA 27
TTTTTGAAAGCTCCACAT 22
TTTTGAAAGCTCCACATA 33
TTTGAAAGCTCCACATAT 27
TTGAAAGCTCCACATATC 44
TGAAAGCTCCACATATCC 16
GAAAGCTCCACATATCCA 22
AAAGCTCCACATATCCAG 22
AAGCTCCACATATCCAGG 38
AGCTCCACATATCCAGGT 0
GCTCCACATATCCAGGTA 33
CTCCACATATCCAGGTAC 27
TCCACATATCCAGGTACA 38
CCACATATCCAGGTACAC 16
CACATATCCAGGTACACT 33
ACATATCCAGGTACACTC 27
CATATCCAGGTACACTCG 44
ATATCCAGGTACACTCGA 0
~~~~~~~(중략)~~~~~~~
위와 같습니다.

문제는 여기서 비교할 문자열이 24개의 문자열을 초과하면 결과가 출력되지를 않습니다. 다른 조건에서는 어떤 결과가 나오는 지를 알아보기 위해 아래와 같이 테스트를 하였는데,
define MAX_size를 250001로 지정하고 250000개의 한줄의 문자열이 저장되어 있는 파일을 받아 49개의 문자열을 초과하였을 때 결과가 나오지를 않고,
define MAX_size를 500001로 지정하고 500000개의 한줄의 문자열이 저장되어 있는 파일을 받아 24개의 문자열을 초과하였을 때 결과가 나오지를 않고,
define MAX_size를 1000001로 지정하고 1000000개의 한줄의 문자열이 저장되어 있는 파일을 받아 11개의 문자열을 초과하였을 때 결과가 나오지를 않고,
define MAX_size를 2000001로 지정하고 2000000개의 한줄의 문자열이 저장되어 있는 파일을 받아 5개의 문자열을 초과하였을 때 결과가 나오지를 않습니다.

무조건 500000개나 1000000개의 문자열과 같이 대량의 데이터를 받아야 합니다...
왜 결과가 나오지 않는지가 궁금합니다.

도와주세요~~!!

mithrandir의 이미지

스택사이즈가 허용량을 초과해서 그렇습니다.

ulimit -a 를 보면 stack size를 확인해 볼 수 있는데, 저는 8192KB 로군요.
한가지 방법은 stack size를 증가시키는것.
또 한가지는 stack 대신 malloc을 사용하는 것입니다.

언제나 삽질 - http://tisphie.net/typo/
프로그래밍 언어 개발 - http://langdev.net

stroma289의 이미지

감사합니다.
"ulimit -s (stack size)"로 stack size를 증가시키는 방법을 알아내었습니다.
그런데 malloc를 사용하신다는 것은

str=(char *) malloc (sizeof(char) * (지정한 사이즈 + 1)

위와 같은 것을 사용한다는 것입니까?

본문 소스에 ref, pri에 malloc를 적용 시켜 준다는 것인지...

stroma289의 이미지

잘못작성..

댓글 달기

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