<div>줄거리 : </div> <div>web에서 json 데이터를 파싱해서 db에 저장한다.</div> <div>언어 : C, 구동 환경 : Centos, 컴파일러 : gcc</div> <div><br></div> <div><br></div>어제의 메모리 누수 문제를 해결하였습니다. <div><br></div> <div><a target="_blank" href="http://www.todayhumor.co.kr/board/view.php?table=programmer&no=11942&s_no=10501250&kind=member&page=1&member_kind=total&mn=285973">http://www.todayhumor.co.kr/board/view.php?table=programmer&no=11942&s_no=10501250&kind=member&page=1&member_kind=total&mn=285973</a></div> <div><br></div> <div>완벽한 해결은 아니지만...</div> <div><br></div> <div>제가 직접 정의하는 부분에 있어서 <span style="font-size:9pt;line-height:1.5;">전부 free 해주도록 하였고,</span></div> <div>데이터를 받아오는 curl 부분을 별도 함수로 만들어서 그때그때 쓰고 없애도록 하였으며,</div> <div><br></div> <div>json-c 에서 사용하는 json_object 부분도 json_object_put(); 으로 전부 초기화 하도록 하였습니다.</div> <div><br></div> <div>lcurl memory leak</div> <div>json-c memory leak</div> <div><br></div> <div>두가지 키워드로 검색해보니 저뿐만 아니라 다른 사람들도 메모리 누수 현상을 겪었더라구요.</div> <div>lcurl 의 경우 curl_global_cleanup(); 라는 걸로 해결했지만,</div> <div>json-c 의 경우는 딱히 해결 방법이 없네요;</div> <div><br></div> <div>우선 저렇게 수정한 후 valgrind 로 돌려보니 에러가 없다고 나오네요! 오오!</div> <div><span style="font-size:9pt;line-height:1.5;">(실제 구동에서는 반복문 1천개당 0.1%씩 메모리 점유율이 올라가지만.... 이정도면 1건당 0.5%씩 올라갈때보다는 나아진거 같아서 만족입니다;)</span></div> <div><br></div> <div><br></div> <div>다음 단계.......</div> <div><br></div> <div>작업의 효율을 높이기 위해서 반복문을 쓰레드로 나눠서 구동시키려고 했습니다.</div> <div>현재 1개의 for문을 돌리니 ... 돌아가긴 하는데... cpu 점유율이 5% 미만이네요?</div> <div>아무리 우선순위를 높이고, gcc 옵션에서 -O2 옵션을 주더라도 cpu 점유율이 올라가지도 않고, db에 입력되는 데이터를 보니 상당히 느립니다.</div> <div><br></div> <div>그래서 찾아보니 openmp 라는게 있더군요!</div> <div><a target="_blank" href="http://egloos.zum.com/sunyzero/v/4227785">http://egloos.zum.com/sunyzero/v/4227785</a></div> <div><br></div> <div>예제를 보니 심지어 사용법도 간단해요!</div> <div><br></div> <div><br></div> <div><br></div> <div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px;"> <div><pre style="color:#1f1f1f;font-size:13px;line-height:23px;"><span style="font-family:'굴림';"># include <stdio.h></span></pre><pre style="color:#1f1f1f;font-size:13px;line-height:23px;"># include <omp.h><br>int main() <br>{<br> omp_set_num_threads(4);<br>#pragma omp parallel<br> {<br> printf("Hello world\n");<br> }<br> return 0;<br>}</pre></div></blockquote></div> <div>(쓰레드 4개를 만들어서 Hello world\n를 한번씩 띄움. 즉 총 4개의 Hello world 출력)</div> <div><br></div> <div><br></div> <div>그래서 냉큼 적용했으나..............</div> <div>역시나 원치 않는 결과가 ㅠㅠㅠㅠ</div> <div>원인은 찾았으나 해결 방법이 도무지 떠오르지 않네요...</div> <div><br></div> <div>함수 없이 main 에서 통짜로 실행되던걸 쓰레드로 넘기고 싶어서 분리하여 함수로 만들었는데... 제대로 작동하질 않네요.</div> <div><br></div> <div><br></div> <div>1) 최초 버전</div> <div>변수 선언</div> <div>- for 반복문</div> <div> -> curl로 웹 데이터 가져옮</div> <div> -> json-c로 json_object로 파싱</div> <div> -> 데이터 분류 작업 + db 입력</div> <div>- for문 종료</div> <div>변수 초기화</div> <div><br></div> <div><br></div> <div>2) 함수로...</div> <div><span style="font-size:9pt;line-height:1.5;">- A : db 입력 함수 선언</span></div> <div>--> 인자로 넘어온 char을 db에 입력</div> <div><br></div> <div>- B : curl 함수 선언</div> <div>--> 인자로 넘어온 url에서 데이터를 받아서 문자열로 만든 후 리턴.</div> <div><br></div> <div>- C : A, B 함수를 호출하여 데이터를 처리하는 함수.</div> <div>--> 인자로 넘어온 고유 번호를 B함수로 넘겨서 데이터를 받아 json 작업을 거쳐서 A 함수 호출.</div> <div><br></div> <div>변수 선언</div> <div>- for</div> <div> -> C 함수 호출</div> <div> -> 고유 번호 증가</div> <div>- for 종료</div> <div><br></div> <div>이렇게 만들었습니다...</div> <div>테스트를 해보니 쓰레드 4개를 만들어서 고유 번호를 증가시키고, 그것을 C 함수로 넘긴 후 A, B 함수까지 전달이 잘 되는 것은 확인했습니다.</div> <div>하지만 C 함수에 있는 아래 작업에서 에러가 나오더라구요.</div> <div><br></div> <div><br></div> <div>// 고유번호를 가지고 데이터를 받아와서 처리 후 db에 저장하는 함수.</div> <div>void B(MYSQL *con, long num){</div> <div>- 생략 -</div> <div>json_object *jobj;</div> <div>- 생략 -</div> <div><br></div> <div>jobj = json_tokener_parse(get_json(url)); // get_josn() 함수는 직접 만든 함수로 고유 번호를 넘기면 url에서 데이터를 문자열로 돌려줌.</div> <div>- 생략 -</div> <div>}</div> <div><br></div> <div>이 부분을 주석처리하면 정상적으로 값을 넘겨주는데, 이 부분만 거치면 openmp 부분이 정상 작동하지 않더라구요.</div> <div>아무래도 json_object *jobj 가... 여러 쓰레드 사이에 공유가 되면서 생기는 문제인 것 같은데...</div> <div>이걸 어떻게 해결해야할지 해결 방법이 떠오르질 않습니다. --;</div> <div><br></div> <div>openmp 라는걸 그냥 쓰지 말까도 싶어지네요...</div> <div>구글링을 아무리 열심히해도..</div> <div>저처럼 json-c를 사용한 예제를 찾지 못하고 있습니다. ㅜㅜ</div> <div><br></div> <div>이런식의 작업을 할때 좋은 해결 방법이 있을까요?</div> <div><br></div> <div>1. 컴파일 옵션이나 소스코드를 수정하여 cpu 사용량을 올려 작업 속도를 높인다.</div> <div>(nice 명령어로 -18로도 만들어봤으나 속도는 차이가 없더라구요)</div> <div><br></div> <div>2. openmp 말고 다른 멀티 쓰레드를 사용한다.</div> <div><br></div> <div>3. 다른 방법!</div> <div><br></div> <div>전 글에도 썼었지만...</div> <div>초당 30~50회 정도의 반복 작업을 시켜야하는 거라서요... 좋은 방법이 있을까요?</div>
댓글 분란 또는 분쟁 때문에 전체 댓글이 블라인드 처리되었습니다.