2013-04-15 52 views
3

我在mongodb中運行約120萬條記錄的查詢。查詢通過mongo shell和使用Java驅動程序快速執行,但是當我嘗試通過Java驅動程序將結果轉換爲json對象時,它非常緩慢(查詢需要< 100ms,但轉換爲json需要> 30s) 。結果集約有5k項。我正在使用JSON.serialize(cursor)進行轉換。mongodb java驅動程序將大型結果集轉換爲json

雖然我希望它採取的一點點時間來轉換成JSON字符串,如果我運行從shell查詢,但做

var cursor = //execute query 
var arr = cursor.toArray(); 
arr 

它很快打印出來。

在序列化過程中,mongo服務器統計報告了越來越多的頁面錯誤,但是我增加了我的RAM,使其比整個集合加索引大得多。

想想這裏可能會發生什麼,以及如何提高轉換爲json的速度?

回答

2

當您得到遊標並且即使有遊標時,查詢也沒有執行,您只能得到一小部分結果。

通常我會建議不要將所有結果加載到內存中,使用toArray()或序列化爲內存中的字符串。 50K文檔將佔用大量客戶端內存,並且分配內存的效率也不高。

如果您遇到10gen Java驅動程序,那麼您需要等待JAVA-709才能解決流式寫入功能。 Asynchronous Java Driver支持寫入流的功能。

如果你可以使用外部程序,你可能想看看mongoexport。它可以將JSON寫入文件或標準輸出,並且應該接近最佳性能。

第一次查詢運行時,頁面錯誤是正常的。第二次,如果服務器有足夠的內存將整個數據集保存在內存中,則應該看到很少的頁面錯誤。如果您在與服務器相同的機器上運行客戶端,它可能會將數據從內存中推出,以便爲客戶端分配JSON blob所需的內存。

HTH - Rob

+0

感謝您的解釋。同意將50k文件放在內存中效率不高。欣賞與支持流式傳輸的驅動程序的鏈接。 –

0

事實證明它與mongo shell一樣長。當我從shell進行測試時,結果必須已被緩存,所以我認爲我從shell中看到了更好的結果,但在我的情況中不是這樣。