이 블로그 검색

2022년 9월 12일 월요일

https://jeremyko.github.io/ 를 만들었다

https://jeremyko.github.io/

그 동안 코드 편집 하는 게 너무 번거로웠는데 markdown 이 지원되는 github pages 가  좋은거 같다 

2022년 9월 2일 금요일

(python) docker container 에서 scipy, numpy 사용 시 thread 과다 생성 문제 (incorrect cpu count)

개발 중인 python 프로젝트에서 scipy 패키지 interpolate 를 사용하는 코드가 있는데, docker 기반 클라우드 환경에서 실행하니 먹통이 되고 멈추는 현상이 발생 했다. 하지만, 이 코드를 내 랩탑 에서 돌려보면, 정상 동작한다.

문제의 원인을 찾아보니, docker container 를 생성하면서 할당한 cpu 개수와 실제 머신의 전체 CPU 개수 불일치로 인한 문제였다. 이 현상에 대해 정리 해 본다.


  • docker container 기반에서 OpenBLAS, MLK 를 사용하는 numpy, scipy 등의 패키지 내부에서 과도한 thread 생성이 안되게 주의 해야 한다.
  • 비록 명시적으로 thread 를 사용하지 않았어도, numpy, scipy 내부적으로는 multi thread 가 생성 된다는 것을 알아둘 필요가 있다.
  • 코드가 동작하는 환경을 분석하고, 성능 문제가 있는 경우에만 시도한다


좀 더 자세히 알아보면, 

2022년 8월 21일 일요일

(pthon) pandas 처리 속도 개선에 대하여

지금 하고 있는 프로젝트에서 python pandas 와 numpy를 사용해서 데이터를 처리하는 부분이 있다.
그런데 기존에 있던 처리 속도가 느려서 이 부분을 검토하면서,
처리 속도를 높이기 위해 이것 저것 수정해서 테스트 하다 보니 알게 된 것들이 있어서 정리해 본다.


- 최선의 방식은 numpy ndarray vectorization 처리다.

- for loop를 이용해서 모든 데이터를 순회하는 방식은 피해야 한다. 
  (nested for loop 방식은 어떤 식 으로 든 개선의 여지가 있다)


그럼 위 내용에 대해서 상세히 확인 해 보도록 하자.
우선 기존 소스 분석을 통해서 로직을 심플 하게 추려서 만들어 보면 다음과 같았다.

2022년 3월 24일 목요일

golang 1.18의 workspace mode 알아보기

이번에 1.18 버전이 나오면서 크게 변경된 것 (generic, fuzzing, 성능 향상, workspace 모드) 중에서 나에겐 workspace 의 유용함이 가장 먼저 다가왔다. 

실제 프로젝트에서 golang 으로 개발하는 경우에 아주 유용한 기능이라고 생각된다. 

workspace 는 개발자가 동시에 여러 모듈들을 생성/수정 하면서 개발하는 경우 유용하게 사용될 기능이다.

예를 들자면, 어떤 모듈A 를 수정해야 하는데 , A모듈이 사용 중인 모듈B 도 같이 동시에 수정이 필요한 경우를 가정해보자.

개발 시 분명히 마주치게 될 이런 문제를 1.18 버전 이전에는 어떻게 해결했냐 하면, 

A모듈의 go.mod 파일에서 replace 지시자를 사용해서, B모듈의 경로를, 지금 수정하는 로컬 위치로 변경 해줘야만 했다. 

(이전글 참조 : golang module 작성, 타 모듈에서 로컬 테스트 및 배포 개념 정리)

로컬 경로는 개발자마다 전부 다를 것이므로, 소스 관리 차원에서도 함부로 replace 지시자 가 들어간 go.mod 파일을 소스 repo 에 commit,push 할 수 없었다. 한마디로 매우 성가시고 불편했다.

만약 replace 사용 없이 하려면 각각의 모듈 별로 개별 test 코드를 만들어서 독립적으로 완벽히 테스트 하면서 개발 후, 동시에 repo에 발행한다며, 아마도 어쩌면? 가능 했을지도 모른다. 

하지만 개발자는 신이 아니기에, 이런 식으로 개발 할 수는 없을 듯 하다. A 를 수정하다 보면 B 도 수정 필요하고 또 그 반대의 경우도 수시로 발생 될 수 있기 때문이다.

그런데 이제 workspace 를 사용하면 훨씬 편한 개발이 가능해졌다. go.work 파일이 존재하면 workspace mode로 동작하게 된다. 

그럼 이전 글에서 설명된 예제를 workspace 를 사용하는 것으로 수정을 해본다.

 

2022년 1월 2일 일요일

GOSOF : A simple yet quite practical socket framework made with golang.

 

https://github.com/jeremyko/gosof


Instead of the simple socket echo example that comes up a lot if you search, I tried to implement it so that it can properly handle the buffering of tcp data that can be split into pieces or transmitted all at once. And to increase reusability, I implemented it so that it can be used like a framework.

  • The framework calls the user-specified callback.
  • For TCP, the total size of user data is passed to the framework via a callback, and the framework does TCP buffering automatically.
  • Byte data is exchanged.
  • Supports TCP, UDP and Domain Socket.


When sending a byte message composed of a fixed-length header and variable-length body data, it may be useful as it can reduce the work a little.

udp and domain socket are also supported, but this is not much different from using the existing net package as it is, so there is no special point.

 

golang 으로 만든 간단하면서도 꽤 실용적인 socket 프레임워크.

검색하면 많이 나오는 단순한 socket echo 예제 대신, 조각으로 쪼개지거나, 한번에 다 전송될수 있는 tcp 의 데이터 버퍼링 처리를 제대로 처리 할 수 있게 끔 구현해 봤다. 그리고 재활용성을 높이기 위해 프레임워크 처럼 사용할수 있게 구현 해 봤다. 몇가지 특징을 나열하면,

  • 프레임워크가 사용자 지정 콜백을 호출한다.
  • TCP의 경우 사용자 데이터의 전체 크기는 콜백을 통해 프레임워크에 전달되고 프레임워크는 TCP 버퍼링을 자동으로 수행 해준다.
  • 바이트 데이터를 주고 받는다
  • TCP, UDP 및 도메인 소켓을 지원


고정길이 헤더와 가변길이 body 데이터로 구성된 byte 메시지를 전송할때 조금이나마 작업을 줄일수 있어서, 나름 유용할거 같다.

udp 나 domain socket 도 지원하지만, 이건 뭐 기존 net package 를 그대로 사용하는것과 거의 차이가 없기 때문에 별다른 점은 없겠다. 

https://github.com/jeremyko/ASockLib 과 비슷한 사용법을 가지고 있다.