2014-02-26 220 views
8

我的服務返回非常大的JSON對象的響應 - 大約60MB。經過一些分析後,我發現幾乎所有的時間都在執行JSON.stringify()調用,該調用用於轉換爲字符串並將其作爲響應發送。我嘗試過stringify的自定義實現,它們甚至更慢。NodeJS JSON.stringify()瓶頸

這對我的服務來說是個瓶頸。我希望能夠儘可能多地處理每秒請求 - 目前1個請求需要700毫秒。

我的問題是:
1)我可以優化發送響應部分嗎?是否有比將對象串化併發送響應更有效的方法?

2)在一個單獨的線程中使用異步模塊並執行JSON.stringify()可以提高整體的請求數/秒(考慮到90%以上的時間用於該呼叫)?

+0

你可以做什麼來減少這些對象的大小?什麼讓他們這麼大? – jameslafferty

+0

您是否嘗試過使用socket.io。 JSON.stringify將整個對象加載到內存中,所以我不認爲你可以優化它。但60兆的JSON太大了。 – himangshuj

+0

您是否發送冗餘數據?如果修改了數據的子集,則不要重新發送所有數據,只需重新發送子集。這可能允許您減少您串聯的數據量 – Paulpro

回答

8

你有兩個選擇:

1)找到一個JSON模塊,讓您流的字符串化操作,並在大塊處理它。我不知道這樣一個模塊是否在那裏,如果它不是你必須建立它。 編輯:感謝Reinard Mavronicolas在評論中指出JSONStream。我實際上已經在我的背後找到了這樣的東西,用於不同的用例。

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 SO問題類似於這一個:http://stackoverflow.com/questions/13503844/streaming-piping-json-stringify-output-in-node-js-express –