streaming 으로 map/reduce를 하면서 STDIO 를 통해 문자열 와리가리를 하던 중,

reduce 스테이지에서 램 사용량도 적으면서 CPU 로드만 엄청나게 높이고,

당최 reduce 진행이 안되는 상황에 직면하여 이리저리 보던중,

reduce에서 루프를 통해 STDIN 을 읽을 때 들어오는 문자열 1라인이 엄청 커서 문제가 있다고 진단했다.

(물론 그 문자열은 delimiter 로 잘라서 또 루프를 돌며 뭔가를 한다...)


그래서 어떻든 문자열의 길이를 한 번 줄여보자 싶어서 문자열 압축을 하려고, 

map 스테이지에서 reduce로 넘길 때 gzencode 를 써서 압축을 해서 넘기고,

reduce 스테이지에서 gzdecode 를 이용해 압축을 해제한 다음 작업을 하려고 했는데,

gzdecode() 라는 함수가 없다는 에러가 나왔다.


아니 이게 무슨 소리냐고, 

encode 는 있는데 decode 가 없는 병신같은 상황이 말이 되냐고 구글신에게 문의해 본 결과,

아직 zlib 의 모든 함수가 PHP로 완벽하게 이식된 상황이 아니라는 결론을 얻었다.

gzdecode는 PHP6 에서 추가될 예정.


이리저리 둘러보다 단순 문자열의 경우 header랑 footer를 떼고 간략하게 압축해제할 수 있는 함수를 얻었다.

zlib 압축 알고리즘을 까보는 수고를 하고 싶지는 않아서 100%인지 확인은 못했으나 대략 내가 테스트 해본 건 되는 듯.


참조: http://www.php.net/gzdecode

function gzdecode($data)

{

    return gzinflate(substr($data, 10, -8));

}















Posted by bloodguy
,