본문 바로가기
연구관련/연구생활

결국은 C++ 찬양론자 >.<""

by adnoctum 2013. 5. 9.




   가 될 수밖에 없는 이유는, 다뤄야 하는 파일이 GB 단위를 넘는 경우가 자주 있기 때문이다, >.<"" 지금도, '간단히 코딩해서 결과 나오면 엑셀로 정리하고 바로 집에 가야지', 하고 후다닥 한 다음 실행을 시켜 놓고 잠시 기다렸다. 근데, 어라, 안 끝난다. 결과 파일을 보니 그 당시 이미 1GB가 넘어가 버렸다. 음... 그래서, 뭔가 잘못된 것인가 해서 나와야 하는 데이터의 수를 대충 계산해 보니 얼추 맞는다. 그러니까, 실행된 양 대비 나온 데이터 수가 계산이랑 어느 정도 맞는다. 결론적으로, 최종 결과 파일은 15GB 정도 될 듯. 데이터는 1억개 정도 나올 듯. 그럼, 이걸 엑셀로 할 수가 없잖아, >.<"" countif 하고 vlookup, pivot table 좀 써야 하는데, 일단 엑셀에는 백만개 정도밖에 데이터가 안 들어갈 뿐만 아니라 이 정도의 개수 가지고 위와 같은 작업을 하면 시간이 꽤 걸리기 때문에, 결국은 또 코딩이다. 


   그럼, 파이썬이냐, 하면 그건 또 아니다. 뭐, 얼마 되지 않는 파일 크기라면 파이썬으로 할 수도 있기야 하겠지만 지금같이 큰 경우 결국 C++ 이다. 이 부분은 좀 오해의 소지가 있는데, 이 파일이 만약 50MB 였다면 파이썬으로 했을 것이다, 가 아니라 50MB 였다면 파이썬으로 할 수도 있었을 것이다, 이다. 정규표현식을 포함한 몇 가지 특수한 상황이 아니면 파일 크기와 상관없이 일단 난 C++로 하니까. 어쨌든 이번엔 언어의 익숙함 호/불호를 떠나서 C++ 로 할 수밖에 없는 상황이라는 것이다. 리눅스 명령어에 없는 몇 가지 작업들, 가령 countif 같은 것들이나 분포도 구해 주는 것 등은 예전에 미리 짜 놓아서 그냥 쓰면 되긴 하는데, 문제는 쟤네가 STL 을 썼기 때문에 지금처럼 데이터가 많은 경우 메모리 때문에 죽을 수도 있다는 것. 이런 경우는 다시 포인터질을 하는 코딩을 해야 한다, >.<"" tanspose 시키는 것도 1만x1만 처럼 매우 큰 행렬 (이론적으론 1억x1억 처럼 RAM 용량을 넘는 것도 가능) 을 transpose 시키는 transpose_huge_matrix 라는 프로그램을 만들어 놓은 것처럼... >.<, ㅋㅋ. 


   기왕 쓰는 김에, C++ 을 좀 더 칭찬해 보자. 일단 포인터. 메모리의 효율적 관리 및 뒤쪽에서 메모리가 어떻게 움직이고 있는지를 어느 정도 생각을 해야 하고, 그럼에 따라 자연스레 메모리를 적게 쓰거나 속도를 빠르게 할 수 있는 방법을 강구하게 해준다. 물론 이 점은 지극히 개인적인 부분이다, ㅋ. * 랑 & 를 섞어 쓰면서 코딩하는 그 재미란! *(std::max_element(a.begin(), a.end()))* *p; 막 이런 거, ㅋㅋ. *(int*)(&passed), 막 이런 거. 또 포인터를 쓰면서 자연스레 익숙해진 메모리는 새로운 파일 포멧을 만들어야 할 필요가 있을 땐 걍 만들지, 뭐, 하게끔 해준다. 실제로 몇몇 프로그램들은 파일 포멧을 내가 디자인해서 쓰기도 한다, ㅋ. 어쨌든 결론은 "포인터 안 쓰고 어떻게 코딩해요?", 정도?, ㅋㅋ. 


  그리고 generic. template. template 을 사용한 함수를 작성할 때의 그 깔끔함과 유용함을 맛보기 시작하면 이놈 정말 물건이구나, 싶다. 여전히 잘 모르겠는 문법이 존재하고, meta-programming 을 거의 안 하지만, 그래도 꽤 자주 template 을 알고리즘이나 data 구조를 만들 필요가 있을 때 사용하는지라 template 없으면 얼마나 불편했을까 를 생각하면 아찔하다. 


   또, STL. 왜 좋으냐고? 생략. 


   또, 문법에 있어서의 자유. 물론 될 수 있으면 명시적으로 하는 것을 선호하는지라 왠만해선 풀어 쓰긴 하는데, 결국은 익숙함의 문제이기 때문에 C++의 문법적 자유를 어느 정도 사용하긴 한다. a = b > c ? 1 : -1; 뭐, 이런 것이라거나, a = (int)(b == c); 이런 것. a ^= 0x01, 이런 건 걍 문법적으로 지원되는 것일 뿐이니 좀 다르지만, ㅋ. 


   OOP는 확실히 좀 애매꾸리하긴 하다. 이 부분은 자바 승. 하지만 C++도 그래도 나름 OOP 가 되는지라 쓸 필요가 있을 땐 요모조모 요긴하게 써먹을 수 있다. 특히나 함수객체 같이 STL 과 섞어 쓸 수 있는 것들, 혹은 상속 등을 이용한 다형성의 이용 등에 익숙해지면 클래스 디자인의 재미에 빠질 수 있다. 


    속도. 이 부분도 생략. 아, 에피소드 몇 개만 얘기해 보자. 내 친구는 ruby 를 배워볼까, 하더니 PCA를 바로 구현하기 시작했다. 그런데 녀석이, 

"왜 결과가 안 나오지"

하더니 Ctrl + C 를 누르고는, 

"어, 아직 실행되는 거였네?, ㅋㅋㅋ."

너무 느리다고 결국 C 로 바꿔서 구현하니 결과가 틱 하고 뱉어지더라는. 물론 루비가 상당히 느리긴 한데, C가 매우 빠른 것도 있지, ㅋ. 예전에 같은 작업을 내가 C++로 구현하고 다른 사람이 펄로 구현해서 실행을 시킨 적이 있다. 난 결과를 보고 그 사람 자리에 가서 이런저런 얘기를 하다, 

"가서 결과 안봐요?"

"무슨 결과요?"

"실행시킨 거요."

"다 보고 나온건데..."

"아, 그래요? 난 아직도 실행중인데, ㅋㅋㅋ."

이런 적도 있었지. 저 때, 몇몇 루틴을 펄로 된 걸 내가 C++로 바꿔 줬는데, 며칠 뒤 농담을 던진다. 

"정설씨가 짠 코드, 잘못된 거 아니에요?, ㅋㅋㅋ"

"헉, 왜요?"
"3시간 걸리던 게 10분만에 끝나서요. 지금 결과 나온 거 다 비교해 봤는데, 맞네요, ㅋㅋㅋ."

영상분석으로 혈류동역학 분석하던 연구 초반에는 다른 애가 matlab 으로 계산했는데, 나중엔 내가 C++로 다 바꿔 줬다. 그리고 그 아이가 어느 날 와서, 

"결과가 10분만에 나와요!?"

"응."
"하하하. 전 너무 오래 걸려서 실행시켜 놓고 집에 가는데."

ㅋㅋㅋ 이런 적도 있었지. 




그러니까 내가 C++을 좋아하는 이유를 정리해 보자면, 

1. 포인터 

2. generic (template)

3. STL : 일단 이거 하나로 상당히 많이 먹고 출발. 

4. 문법에 있어서 약간의 자유 (perl 보다 strict 하고 python 이나 pascal 보단 유연한, ㅋ)

5. OOP (요건 사실 좀 부족한 감이 있다)

6. 속도


정도 되겠다. 숫자는 순위를 나타낸다. 그래, 내가 여기에 주로 파이썬을 추천한다고 써 놓긴 했지만 정작 나는 C++을 가장 좋아한다, ㅋ. 물론 그래도 추천을 하자면 파이썬. 학습곡선/사용곡선이 너무 다르다, 두 언어가. 




'연구관련 > 연구생활' 카테고리의 다른 글

쳇, 나이 들었어, >.<""  (0) 2014.03.24
내자리, ㅋ.  (0) 2014.02.28
순식간에 10개의 창을  (0) 2013.05.06
부지런했던 한 주  (2) 2013.03.15
오래간만에 온 동측  (0) 2013.03.13