2014-02-26 4 views
8

내 서비스는 대용량 JSON 객체 (약 60MB)의 응답을 반환합니다. 어떤 프로파일 링을 한 후에는 문자열로 변환하고 응답으로 보내는 데 사용되는 JSON.stringify() 호출을 거의 모든 시간을 소비하는 것으로 나타났습니다. 내가 stringify의 사용자 정의 구현을 시도하고 그들은 심지어 느립니다.NodeJS JSON.stringify() 병목 현상

이것은 내 서비스의 병목입니다. 가능한 한 초당 많은 요청을 처리 할 수 ​​있기를 원합니다. 현재 1 회의 요청에는 700ms가 소요됩니다.

내 질문 :
1) 응답 부분의 전송을 최적화 할 수 있습니까? 객체를 문자열로 변환하고 응답을 보내는 것보다 효과적인 방법이 있습니까?

2) 비동기 모듈을 사용하고 별도의 스레드에서 JSON.stringify()을 수행하면 전반적인 요청 수 (즉, 90 % 이상의 시간이 해당 호출에서 사용됨)가 향상됩니까?

+0

해당 개체의 크기를 줄이기 위해 할 수있는 방법은 없습니까? 그들을 그렇게 크게 만드는 것은 무엇입니까? – jameslafferty

+0

socket.io를 사용해 보셨습니까? JSON.stringify는 전체 객체를 메모리에로드하므로 최적화 할 수 없다고 생각합니다. 그러나 60mb의 json은 너무 거대합니다. – himangshuj

+0

중복 데이터를 보내시겠습니까? 데이터의 하위 집합이 수정 된 경우 모든 데이터를 다시 보내지 않고 하위 집합 만 다시 보내면됩니다. 그러면 문자열 화되는 데이터의 양을 줄일 수 있습니다. – Paulpro

답변

8

당신은 두 가지 옵션이있어 :

1) 당신이 캐릭터 라인 화 작업을 스트리밍 할 수 있도록하는 JSON 모듈을 찾아 덩어리를 처리합니다. 나는 그런 모듈이 밖에 있는지, 당신이 그것을 만들어야하는지 모른다면 모르겠다. 편집 : 의견에 JSONStream을 지적한 Reinard Mavronicolas에게 감사드립니다. 다른 용도로 사용하기 위해 실제로 이와 같은 것을 찾기 위해 필자는 후부의 버너에 넣었습니다.

2) async은 스레드를 사용하지 않습니다. 처리를 별도의 스레드에 넣으려면 cluster 또는 다른 실제 스레딩 모듈을 사용해야합니다. 여기서주의해야 할 점은 많은 양의 데이터를 처리하고 있으며 스레드를 사용하여 대역폭을 확보하고 있지만 트래픽에 따라 여전히 한계에 도달 할 수 있다는 것입니다.

+1

고마워요! 콘텐츠를 gzip하고 gziped conent를 대신 반환하는 방법도 있습니다. 이 라이브러리 https://github.com/sapienlab/jsonpack은 json 객체를 사용하고 gzipped 문자열을 반환하는 함수를 제공하며 내부적으로 JSON.stringify()를 호출하지 않는 것으로 보입니다. 어떻게 생각해? –

+0

스트리밍/이벤트 처리/청크 처리가 수행되는 한, 아마 괜찮을 것입니다. 많은 데이터를 조각 하나로 나누지 않고 한 번의 작업으로 처리하는 것은 작업을 수행하는 데 아무리 긴 시간이 걸릴 것입니다. – Jason

+0

@ Jason, 1 번 - https://github.com/dominictarr/JSONStream에서 답변에 추가 할 수 있습니다. 또한,이 하나 비슷한 질문 anohter 것 같습니다 : http://stackoverflow.com/questions/13503844/streaming-piping-json-stringify-output-in-node-js-express –