모바일 오유 바로가기
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도쿄올림픽
  • 게시판찾기
  • 오유인페이지
    개인차단 상태
    물어라이코스님의
    개인페이지입니다
    가입 : 12-09-25
    방문 : 3120회
    닉네임변경 이력
    회원차단
    회원차단해제
    게시물ID : humorbest_1093054
    작성자 : 물어라이코스
    추천 : 45
    조회수 : 5643
    IP : 27.117.***.100
    댓글 : 21개
    베스트 등록시간 : 2015/07/11 20:16:21
    원글작성시간 : 2015/07/10 17:16:30
    http://todayhumor.com/?humorbest_1093054 모바일
    뻘글] 몇날며칠을 고생한 메모리 누수를 잡았습니다!
    으헝헝헝헝헝 ㅠㅠㅠㅠㅠㅠ
    정말 프게에서 많은 도움을 받았습니다. ㅠㅠㅠㅠㅠ
    글이 워낙 여러개이고 뒤로 밀린터라...
    결과 보고는 드려야 할 것 같아서요....

    1. 프로그램의 목적
     - HTTP를 통해 제공되는 JSON 데이터를 가져와서 가공후 DB에 저장한다.

    2. 여러가지 사항들
     - 구동 환경은 centos
     - 컴파일러는 gcc
     - C 언어
     - mysql
     - 반복 작업을 무한히 해야하며 빠를 수록 좋지만 상한선은 1초당 20회. (json 데이터 제공측 제한)

    3. 사용된 라이브러리
     - mysql

    4. 프로그램 구동 순서
    1) curl을 이용하여 웹 데이터를 가져온다.
    2) 가져온 데이터를 json object로 만든다.
    3) 데이터를 처리한다.
    4) db에 입력한다.


    5. 대략적인 코드 구성
    main(){
    변수 선언

    for{
    curl에서 데이터 가져옮
    json object로 만듦
    데이터 처리
    (일부)
    for{
    데이터 처리
    db 입력
    }
    db 입력
    }

    mysql_close()
    }

    --> 함수 없음. 그냥 main에서 통짜로 실행


    6. 문제 발생
    - 1차 메모리 누수 ( 반복문 1건당 메모리 사용량 0.5%씩 상승 )
    멍청하게도 모든 변수에 대해 메모리 반환을 하지 않음으로 발생.
    동적 할당으로 선언했던 변수들을 free 로 반환.


    - 2차 메모리 누수 ( 반복문 1건당 메모리 사용량 0.4%씩 상승 )
    그럼에도 불구하고 메모리 누수가 발생함.
    동적할당 했던 변수들을 전부 없애고 고정으로 변경.
    추가로 찾아보니
    json object 로 선언된 변수들을 초기화(?) 해주는 함수를 써줘야 한다고 함.
    전체 for문 하단에 다음과 같이 추가

    if (!jobj){ json_object_put(jobj); }


    - 3차 메모리 누수 ( 반복문 100건당 메모리 사용량 0.1%씩 상승 )
    그럼에도 불구하고 매번 반복문이 반복될때마다 계속해서 메모리 누수 발생.
    찾아보니 curl에도 메모리 누수가 있다고 함.

    curl_easy_cleanup(curl);
    curl_global_cleanup();
    free(resData.response); // url에서 가져온 데이터를 보관하는 변수. 데이터 크기에 따라 동적할당을 하므로 free로 반환해야함.


    - 4차 메모리 누수 ( 반복문 100건당 메모리 사용량 0.1%씩 상승 )
    아직도 ㅋㅋㅋㅋㅋㅋㅋㅋㅋ .. ㅋㅋㅋ.ㅋ.ㅋㅋㅋㅋㅋㅋㅋㅋ............
    이때부터 혹시나 하는 마음에 mysql 관련 함수들에도 메모리 누수가 있나 확인해보았으나 없음.
    오유에서 도움을 받아 valgrind 로 검사를 해보니, 여전히 curl 에서 문제가 있다고 나옴.

    더 구글링 해봐도 정답이 없길래.....
    게으름 부리지 말고 작업들을 함수로 따로 만들기로 함.
    함수 작동이 끝나면 사용했던 메모리는 전부 반환하겠지 뭐! <-- 라는 생각..

    char* get_json(char *url) {
    인자로 넘어온 url에서 데이터를 가져오는 작업
    }


    - 5차 메모리 누수 ( 반복문 1000건당 메모리 사용량 0.1%씩 상승 )
    ㅋㅋㅋ......
    이때 오유에서 아예 고정 길이로 데이터를 받아버리라는 조언을 얻음.
    그렇게 코드를 변경 했음에도 (char test[35000];) 여전히 메모리 누수가 발생함.


    - 6차 메모리 누수 ( 반복문 1000건당 메모리 사용량 0.1%씩 상승 )
    차근차근 다시 생각을 해봤는데, 아주 중요한 문제가 있었음.
    새롭게 만든 get_json() 함수에서... 이런 멍청한 부분이 있음.

    char* get_json(){
    데이터 처리
    data = malloc(siezeof(char)*size);
    return data;
    }

    !?

    그렇다고 free(data)를 한 후 return data; 를 할수는 없었기에 머리가 아파짐.

    ㅁㄴ이ㅏ러니ㅏㅇ러니아러미낭러민아럼ㄴ이라ㅓㅁ닝러

    어떻게 해야할까...........

    생각하다가...

    한번도 안해본건데.... 왠지 될거 같다는 생각으로 이렇게 바꿈.


    void get_json(char *url, char **data){
    데이터 처리
    *data = malloc(sizeof(char) * size+1);
    strcpy(data, 처리된데이터);
    return data;
    }

    void main(){
    char *data;
    get_json(url, &data);
    jobj = json_tokener_parse(data); // json 으로 파싱
    free(data);
    }

    -> 데이터를 리턴시킬 문자열 변수를 main에서 선언하고 그 주소를 인자로 넘긴 후,
    get_json함수에서 데이터 길이에 따라 동적 할당을 해주고 데이터 복사 후 함수 종료.

    -> 데이터가 리턴 되었으므로 json object를 만든 다음 바로 free로 메모리 반환.

    7. 결과
    프로그램 실행시 메모리 점유율 0.8%
    10만건을 반복 후 메모리 점유율 0.8%



    도움을 주신 오유 프게 분들께 감사드립니다. (__);
    이제 이걸 멀티 쓰레드로 해보는걸 한번 도전해보려구요 ^-^ 아이고 좋다....

    이 게시물을 추천한 분들의 목록입니다.
    [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 초과시 해당없음)

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

    번호 제 목 이름 날짜 조회 추천
    간만에 꼬소한 뉴스 [27] 물어라이코스 18/03/12 21:05 15823 81
    비공식 배그썰 [7] 물어라이코스 17/12/09 22:05 4360 36
    오징어 검색기 개발자 입니다. [4] 물어라이코스 17/05/12 18:19 2033 15
    이벤트 한번 했다가 "꾼" 들한테 다 말아먹었네요... [121] 물어라이코스 17/02/24 20:47 17958 153
    오늘본_역대급_초보스티커.png [70] 물어라이코스 17/02/07 18:13 13219 70
    자동화의 끝.... [52] 물어라이코스 16/08/16 23:10 5291 56
    와!!! 바보님이 부트스트랩을 쓰기 시작하셨어요!!! [25] 물어라이코스 16/04/29 17:11 5043 39
    비가 무지막지하게 많이 오고 있습니다 [13] 물어라이코스 16/04/16 20:53 2835 53
    택배 조회 싸이트를 하나 만들어봤습니다... [20] 물어라이코스 16/04/07 12:46 2521 58
    모 BJ의 헬퍼 사용 여부는 증명이 불가능합니다. +주의사항 [35] 물어라이코스 16/03/07 21:34 11052 39
    ★ 오징어 건조장을 많이 이용해주세요 ㅜㅜ [142] 물어라이코스 16/02/12 21:27 3234 32
    ★ 오징어검색기 시즌2, 채팅방 기능을 추가하였습니다! [297] 물어라이코스 16/02/11 19:43 3022 37
    ★ 오유 광고에서 불편한 광고 차단하는 방법 [6] 물어라이코스 15/12/28 21:34 5081 54
    ★오유채널에서 톡노말 하실때 오징어 검색기를 이용해보세요! [38] 물어라이코스 15/12/22 20:51 1939 22
    고소 관련 글을 롤게에 올리는거 자체는 괜찮다고 봅니다... 물어라이코스 15/12/09 19:34 1979 15
    [가정용 네트워크] WiFi와 공유기에 관련된 가이드 V 1.0 [18] 물어라이코스 15/09/25 18:28 7499 64
    오징어등록기] 이제 가입일자와 방문횟수가 함께 표시됩니다. [15] 물어라이코스 15/07/29 20:22 1369 21
    뻘글] 몇날며칠을 고생한 메모리 누수를 잡았습니다! [21] 물어라이코스 15/07/11 20:16 5643 45
    재저격] 롤게 사람들 단체 비방 후 사과 없음. [21] 물어라이코스 15/06/17 21:54 4109 40
    오징어 검색기 1400명 돌파 기념 나눔 !!! [59] 물어라이코스 15/06/03 23:56 2215 45
    오징어 등록제를 많이 알려주세요! [90] 물어라이코스 15/05/18 12:34 2855 37
    ★오유 채널을 위한 오징어 등록제 싸이트 입니다! [141] 물어라이코스 15/05/15 02:45 1046 30
    오유 유저 등록제 관련한 고민들입니다.... [48] 물어라이코스 15/05/12 09:32 2865 44
    오유 채널에서 오유인을 확인하기 위한걸 만들었어요! [1100] 물어라이코스 15/05/11 20:36 4914 105
    늦었지만... 콜롬비아 대사관에 항의 메일을 보냈습니다. [6] 물어라이코스 15/04/15 23:39 5967 64
    이계덕 기자의 오유 유저 고소가 이어지고 있습니다. [124] 물어라이코스 15/03/05 06:09 17152 184
    중복 신고자 중 한명으로써 바보님께 죄송하여 글을 남깁니다. [27] 물어라이코스 15/03/04 13:06 - -
    이계덕기자 차단해제를 하지 말아주시기 바랍니다. [35] 물어라이코스 15/03/03 19:09 - -
    롤 모욕죄 고소하는 방법.txt - 번외편 [23] 물어라이코스 15/01/15 20:45 47405 35
    롤 모욕죄 인실X 실현! 인증! (결과 있음) - 2편 [112] 물어라이코스 15/01/14 20:11 6256 102
    [1] [2]
    단축키 운영진에게 바란다(삭제요청/제안) 운영게 게시판신청 자료창고 보류 개인정보취급방침 청소년보호정책 모바일홈