[python] how to release memory(or dict, array) - dsindex/blog GitHub Wiki

python으로 작성된 프로그램으로 Hadoop상에서 map 작업을 돌리는 경우가 있다. map은 갯수는 많을수록 작업이 빨리 종료되는데, 개별 mapper가 차지하는 메모리사이즈가 크다면 많은 mapper를 하나의 서버에 띄울수가 없다. 그래서 아주 큰 리소스를 필요로하는 mapper의 경우는 c 언어와 mmap 방식으로 구현한 모듈을 사용하게되는데, 문제는 이것이 아니라 python 자체에서도 나타난다. 예를 들어서, 500만 라인의 키워드를 일시적으로 읽어서 dict 자료구조에 저장했다가 처리를 해서 필요한 일부분의 정보만 빼내 리턴하는 함수가 있다고 하자.

def build_something(file) :
    data = {}
    (while read line)
         (data <-- copy)
    subset = {}
    for key,val in data.iteritems() :
         (subset <-- if needed)
    return subset

여기서 data는 잠시 사용되는 자료구조라서, build_something이 끝나면 메모리가 free될것이라고 기대하고 프로그래밍하는 경우가 많다. 하지만, python은 바로바로 그런짓(?)을 해주지 않는다. 물론, gc가 동작하긴하지만.... 그래서 하나의 mapper가 실제 사용도 하지 않는 메모리를 대량의 메모리를 잡고 있는 문제가 생긴다. 따라서, 필요한 정보는 미리 전처리를 해서 빼내고 그것을 파일로 해당 mapper에 입력해주는 방식을 추천한다.

혹은, reference에서 설명하는 것처럼 child process를 하나 만들고 그것에서 build_something을 해주는 방식도 유용하다. (subset은 parent와 공유하게하고) child가 죽으면 data도 자동으로 사라질것이다. memory intensive한 작업에 python을 사용할 경우는 여러가지로 코딩스타일에 유의해야할것 같다.