모바일 오유 바로가기
http://m.todayhumor.co.kr
분류 게시판
베스트
  • 베스트오브베스트
  • 베스트
  • 오늘의베스트
  • 유머
  • 유머자료
  • 유머글
  • 이야기
  • 자유
  • 고민
  • 연애
  • 결혼생활
  • 좋은글
  • 자랑
  • 공포
  • 멘붕
  • 사이다
  • 군대
  • 밀리터리
  • 미스터리
  • 술한잔
  • 오늘있잖아요
  • 투표인증
  • 새해
  • 이슈
  • 시사
  • 시사아카이브
  • 사회면
  • 사건사고
  • 생활
  • 패션
  • 패션착샷
  • 아동패션착샷
  • 뷰티
  • 인테리어
  • DIY
  • 요리
  • 커피&차
  • 육아
  • 법률
  • 동물
  • 지식
  • 취업정보
  • 식물
  • 다이어트
  • 의료
  • 영어
  • 맛집
  • 추천사이트
  • 해외직구
  • 취미
  • 사진
  • 사진강좌
  • 카메라
  • 만화
  • 애니메이션
  • 포니
  • 자전거
  • 자동차
  • 여행
  • 바이크
  • 민물낚시
  • 바다낚시
  • 장난감
  • 그림판
  • 학술
  • 경제
  • 역사
  • 예술
  • 과학
  • 철학
  • 심리학
  • 방송연예
  • 연예
  • 음악
  • 음악찾기
  • 악기
  • 음향기기
  • 영화
  • 다큐멘터리
  • 국내드라마
  • 해외드라마
  • 예능
  • 팟케스트
  • 방송프로그램
  • 무한도전
  • 더지니어스
  • 개그콘서트
  • 런닝맨
  • 나가수
  • 디지털
  • 컴퓨터
  • 프로그래머
  • IT
  • 안티바이러스
  • 애플
  • 안드로이드
  • 스마트폰
  • 윈도우폰
  • 심비안
  • 스포츠
  • 스포츠
  • 축구
  • 야구
  • 농구
  • 바둑
  • 야구팀
  • 삼성
  • 두산
  • NC
  • 넥센
  • 한화
  • SK
  • 기아
  • 롯데
  • LG
  • KT
  • 메이저리그
  • 일본프로야구리그
  • 게임1
  • 플래시게임
  • 게임토론방
  • 엑스박스
  • 플레이스테이션
  • 닌텐도
  • 모바일게임
  • 게임2
  • 던전앤파이터
  • 마비노기
  • 마비노기영웅전
  • 하스스톤
  • 히어로즈오브더스톰
  • gta5
  • 디아블로
  • 디아블로2
  • 피파온라인2
  • 피파온라인3
  • 워크래프트
  • 월드오브워크래프트
  • 밀리언아서
  • 월드오브탱크
  • 블레이드앤소울
  • 검은사막
  • 스타크래프트
  • 스타크래프트2
  • 베틀필드3
  • 마인크래프트
  • 데이즈
  • 문명
  • 서든어택
  • 테라
  • 아이온
  • 심시티5
  • 프리스타일풋볼
  • 스페셜포스
  • 사이퍼즈
  • 도타2
  • 메이플스토리1
  • 메이플스토리2
  • 오버워치
  • 오버워치그룹모집
  • 포켓몬고
  • 파이널판타지14
  • 배틀그라운드
  • 기타
  • 종교
  • 단어장
  • 자료창고
  • 운영
  • 공지사항
  • 오유운영
  • 게시판신청
  • 보류
  • 임시게시판
  • 메르스
  • 세월호
  • 원전사고
  • 2016리오올림픽
  • 2018평창올림픽
  • 코로나19
  • 2020도쿄올림픽
  • 게시판찾기
  • 게시물ID : humorbest_1093054
    작성자 : 물어라이코스
    추천 : 45
    조회수 : 5613
    IP : 27.117.***.100
    댓글 : 21개
    베스트 등록시간 : 2015/07/11 20:16:21
    원글작성시간 : 2015/07/10 17:16:30
    http://todayhumor.com/?humorbest_1093054 모바일
    뻘글] 몇날며칠을 고생한 메모리 누수를 잡았습니다!
    으헝헝헝헝헝 ㅠㅠㅠㅠㅠㅠ <div>정말 프게에서 많은 도움을 받았습니다. ㅠㅠㅠㅠㅠ</div> <div>글이 워낙 여러개이고 뒤로 밀린터라...</div> <div>결과 보고는 드려야 할 것 같아서요....</div> <div><br></div> <div>1. 프로그램의 목적</div> <div> - HTTP를 통해 제공되는 JSON 데이터를 가져와서 가공후 DB에 저장한다.</div> <div><br></div> <div>2. 여러가지 사항들</div> <div> - 구동 환경은 centos</div> <div> - 컴파일러는 gcc</div> <div> - C 언어</div> <div> - mysql</div> <div> - 반복 작업을 무한히 해야하며 빠를 수록 좋지만 상한선은 1초당 20회. (json 데이터 제공측 제한)</div> <div><br></div> <div>3. 사용된 라이브러리</div> <div> - curl (<a target="_blank" href="http://curl.haxx.se/" target="_blank">http://curl.haxx.se/</a>)</div> <div> - json-c (<a target="_blank" href="https://linuxprograms.wordpress.com/2010/05/20/json-c-libjson-tutorial/" target="_blank">https://linuxprograms.wordpress.com/2010/05/20/json-c-libjson-tutorial/</a>)</div> <div> - mysql</div> <div><br></div> <div>4. 프로그램 구동 순서</div> <div>1) curl을 이용하여 웹 데이터를 가져온다.</div> <div>2) 가져온 데이터를 json object로 만든다.</div> <div>3) 데이터를 처리한다.</div> <div>4) db에 입력한다.</div> <div><br></div> <div><br></div> <div>5. 대략적인 코드 구성</div> <div>main(){</div> <div>변수 선언</div> <div><br></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>for{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>curl에서 데이터 가져옮</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>json object로 만듦</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>데이터 처리</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>(일부)</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>for{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>데이터 처리</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>db 입력</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>db 입력</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div><br></div> <div>mysql_close()</div> <div>}</div> <div><br></div> <div>--> 함수 없음. 그냥 main에서 통짜로 실행</div> <div><br></div> <div><br></div> <div>6. 문제 발생</div> <div>- 1차 메모리 누수 ( 반복문 1건당 메모리 사용량 0.5%씩 상승 )</div> <div>멍청하게도 모든 변수에 대해 메모리 반환을 하지 않음으로 발생.</div> <div>동적 할당으로 선언했던 변수들을 free 로 반환.</div> <div><br></div> <div><br></div> <div>- 2차 메모리 누수 ( 반복문 1건당 메모리 사용량 0.4%씩 상승 )</div> <div>그럼에도 불구하고 메모리 누수가 발생함.</div> <div>동적할당 했던 변수들을 전부 없애고 고정으로 변경.</div> <div>추가로 찾아보니</div> <div>json object 로 선언된 변수들을 초기화(?) 해주는 함수를 써줘야 한다고 함.</div> <div><span style="font-size:9pt;line-height:1.5;">전체 for문 하단에 다음과 같이 추가</span></div> <div><br></div> <div>if (!jobj){ json_object_put(jobj); }</div> <div><br></div> <div><br></div> <div>- 3차 메모리 누수 ( 반복문 100건당 메모리 사용량 0.1%씩 상승 )</div> <div>그럼에도 불구하고 매번 반복문이 반복될때마다 계속해서 메모리 누수 발생.</div> <div>찾아보니 curl에도 메모리 누수가 있다고 함.</div> <div><br></div> <div><div>curl_easy_cleanup(curl);</div> <div>curl_global_cleanup();</div> <div>free(resData.response); // url에서 가져온 데이터를 보관하는 변수. 데이터 크기에 따라 동적할당을 하므로 free로 반환해야함.</div></div> <div><br></div> <div><br></div> <div>- 4차 메모리 누수 ( 반복문 100건당 메모리 사용량 0.1%씩 상승 )</div> <div>아직도 ㅋㅋㅋㅋㅋㅋㅋㅋㅋ .. ㅋㅋㅋ.ㅋ.ㅋㅋㅋㅋㅋㅋㅋㅋ............</div> <div>이때부터 혹시나 하는 마음에 mysql 관련 함수들에도 메모리 누수가 있나 확인해보았으나 없음.</div> <div><span style="font-size:9pt;line-height:1.5;">오유에서 도움을 받아 valgrind 로 검사를 해보니, 여전히 curl 에서 문제가 있다고 나옴.</span></div> <div><br></div> <div>더 구글링 해봐도 정답이 없길래.....</div> <div>게으름 부리지 말고 작업들을 함수로 따로 만들기로 함.</div> <div>함수 작동이 끝나면 사용했던 메모리는 전부 반환하겠지 뭐! <-- 라는 생각..</div> <div><br></div> <div>char* get_json(char *url) {</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>인자로 넘어온 url에서 데이터를 가져오는 작업</div> <div>}</div> <div><br></div> <div><br></div> <div>- 5차 메모리 누수 ( 반복문 1000건당 메모리 사용량 0.1%씩 상승 )</div> <div>ㅋㅋㅋ......</div> <div>이때 오유에서 아예 고정 길이로 데이터를 받아버리라는 조언을 얻음.</div> <div>그렇게 코드를 변경 했음에도 (char test[35000];) 여전히 메모리 누수가 발생함.</div> <div><br></div> <div><br></div> <div>- 6차 메모리 누수 ( 반복문 1000건당 메모리 사용량 0.1%씩 상승 )</div> <div>차근차근 다시 생각을 해봤는데, 아주 중요한 문제가 있었음.</div> <div>새롭게 만든 get_json() 함수에서... 이런 멍청한 부분이 있음.</div> <div><br></div> <div>char* get_json(){</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>데이터 처리</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>data = malloc(siezeof(char)*size);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>return data;</div> <div>}</div> <div><br></div> <div>!?</div> <div><br></div> <div>그렇다고 free(data)를 한 후 return data; 를 할수는 없었기에 머리가 아파짐.</div> <div><br></div> <div>ㅁㄴ이ㅏ러니ㅏㅇ러니아러미낭러민아럼ㄴ이라ㅓㅁ닝러</div> <div><br></div> <div>어떻게 해야할까...........</div> <div><br></div> <div>생각하다가...</div> <div><br></div> <div>한번도 안해본건데.... 왠지 될거 같다는 생각으로 이렇게 바꿈.</div> <div><br></div> <div><br></div> <div>void get_json(char *url, char **data){</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>데이터 처리</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>*data = malloc(sizeof(char) * size+1);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>strcpy(data, 처리된데이터);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>return data;</div> <div>}</div> <div><br></div> <div>void main(){</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>char *data;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>get_json(url, &data);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>jobj = json_tokener_parse(data); // json 으로 파싱</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>free(data);</div> <div>}</div> <div><br></div> <div>-> 데이터를 리턴시킬 문자열 변수를 main에서 선언하고 그 주소를 인자로 넘긴 후,</div> <div>get_json함수에서 데이터 길이에 따라 동적 할당을 해주고 데이터 복사 후 함수 종료.</div> <div><br></div> <div>-> 데이터가 리턴 되었으므로 json object를 만든 다음 바로 free로 메모리 반환.</div> <div><br></div> <div>7. 결과</div> <div>프로그램 실행시 메모리 점유율 0.8%</div> <div><span style="font-size:9pt;line-height:1.5;">10만건을 반복 후 메모리 점유율 0.8%</span></div> <div><span style="font-size:9pt;line-height:1.5;"><br></span></div> <div><img src="http://down.humoruniv.org/hwiparambbs/data/thema2/hu_1419521607_8116879720.jpg" alt=""></div> <div><br></div> <div><br></div> <div>도움을 주신 오유 프게 분들께 감사드립니다. (__);</div> <div>이제 이걸 멀티 쓰레드로 해보는걸 한번 도전해보려구요 ^-^ 아이고 좋다....</div>

    이 게시물을 추천한 분들의 목록입니다.
    [1] 2015/07/10 17:20:46  211.232.***.252  Hello,World!  138634
    [2] 2015/07/10 17:30:26  220.70.***.121  반복문  243580
    [3] 2015/07/10 17:43:04  112.146.***.247  청새치.  168661
    [4] 2015/07/10 17:46:42  1.221.***.110  유테디어  607183
    [5] 2015/07/10 18:06:48  122.212.***.142  법  78670
    [6] 2015/07/10 18:22:18  121.144.***.207  라면은3분  559172
    [7] 2015/07/10 21:12:45  220.77.***.49  E_Sukmean  495625
    [8] 2015/07/11 05:29:08  125.141.***.110  찬바람™  632129
    [9] 2015/07/11 05:56:28  59.6.***.89  게이지  563594
    [10] 2015/07/11 20:16:21  115.22.***.155  QbsidianH20  214116
    푸르딩딩:추천수 3이상 댓글은 배경색이 바뀝니다.
    (단,비공감수가 추천수의 1/3 초과시 해당없음)

    죄송합니다. 댓글 작성은 회원만 가능합니다.


    현재 게시판의 베스트게시물입니다.  
    번호 제 목 이름 날짜 조회 추천
    1113341
    중국에서는 프로그래머들의 사기진작을 위해 치어리더를 고용... [55] 펌글 가르마탄루피 15/08/27 10:53 14428 62
    1112397
    컴공과의 모험 [3] 펌글 null값 15/08/24 23:45 6788 24
    1111877
    오래된 SI업체의 두 부류 [12] enoeht 15/08/23 18:56 8005 50
    1110385
    뻘글주의 - 갓 취업한 사람들을 위한 오늘의 조언 [10] 구차니 15/08/20 12:06 5057 26
    1107834
    소스코드에서 본 최고의 코멘트들.txt [14] nipa0711 15/08/14 18:05 7118 38
    1107505
    [저격] 일단 JAVA좀 배우지 마세요! [46] 하까요 15/08/13 20:34 12630 49
    1104183
    친구들끼리 대회나가보니 개발이 얼마나 어려운지도 알았고 얼마나 [7] 크짱맨 15/08/05 23:16 5460 21
    1102924
    어셈블리용 IDE 개발을 시작합니다. [22] 중용자 15/08/02 23:05 2985 37
    1102342
    오퍼 받았습니다!! [23] MioLiquid 15/08/01 15:26 3742 18
    1101812
    프게님들, 제 코드 좀 봐주세요. [17] 취중코딩 15/07/31 02:44 3801 34
    1100709
    고급 개발자로 가기위해 반드시 봐야할 책들 [70] 나이쓰한넘 15/07/28 10:40 7737 114
    1099619
    취직했습니다!!!!!! [20] 매애애 15/07/25 22:19 4373 32
    1099571
    구현된 에뮬레이터 화면과 정상 출력되는 게임들 [16] 중용자 15/07/25 19:56 5673 33
    1093515
    광희 프로그래머설 [14] 펌글 이똑똑 15/07/12 19:45 7094 16
    뻘글] 몇날며칠을 고생한 메모리 누수를 잡았습니다! [21] 물어라이코스 15/07/11 20:16 5613 45
    1092687
    [푸념]저는 프로그래머이고 개발이 즐거웠습니다. [27] 창작글 훼초코보 15/07/10 22:41 5637 45
    1092025
    그림판으로 코딩하기.gif [21] 사닥호 15/07/09 16:35 7632 31
    1091865
    어셈블리 최적화 [18] 중용자 15/07/09 10:01 4056 25
    1091503
    향후 FASM 라이브러리를 배포할 생각입니다. [12] 중용자 15/07/08 15:33 2235 31
    1089729
    Node.js, Mongodb, Socket.io를 이용한 채팅 구현하기 [10] 본인삭제금지 멋쟁이슈도 15/07/04 17:14 4671 36
    1088950
    내가 지금 노는 건가, 일을 하는 건가. TIS-100 [11] BePositive 15/07/02 20:37 7120 55
    1088025
    [뻘글]문서화의 중요성 [21] 방울터메이도 15/06/30 19:30 4136 44
    1088019
    개발시 쓸만한 유틸들.. [23] 창작글 해싱 15/06/30 19:22 5057 60
    1085640
    새벽중에 과제에 현상금 걸었다가 글삭튀하신분~ [109] 반복문 15/06/25 17:31 7022 134
    1084709
    sudo [18] 펌글 REGENTAG 15/06/23 22:34 3896 32
    1084386
    졸업 후 1년 반... 취업 성공했어요 >.< [18] 나데시코♥ 15/06/23 10:00 5179 35
    1079757
    프로그램이나 컴퓨터는 쉬운게 아닙니다. [15] 구차니 15/06/14 20:40 5951 53
    1079597
    프로그램 배포 - 움짤 제작기 SmallCam [26] 옥시기 15/06/14 14:59 5552 101
    [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [다음10개▶]
    단축키 운영진에게 바란다(삭제요청/제안) 운영게 게시판신청 자료창고 보류 개인정보취급방침 청소년보호정책 모바일홈