[英]mongodb java driver converting large result set to json
我在mongodb上運行了大約1.2億條記錄的查詢。 查詢通過mongo shell和使用Java驅動程序快速執行,但是當我嘗試通過Java驅動程序將結果轉換為json對象時,它非常慢(查詢需要<100ms但轉換為json需要> 30s) 。 結果集大約有5k項。 我正在使用JSON.serialize(cursor)
進行轉換。
雖然我希望轉換為json字符串需要一點時間,但是如果我從shell運行查詢但是正在執行
var cursor = //execute query
var arr = cursor.toArray();
arr
它很快打印出來。
mongo服務器統計信息在序列化過程中報告了越來越多的頁面錯誤,但我已經將RAM增加到比整個集合加上索引大得多。
關於這里可能發生什么以及如何提高轉換到json的速度的任何想法?
當你得到光標時查詢沒有執行,即使它有,你只會得到一小部分結果。
通常我建議不要使用toArray()
或序列化到內存中的字符串將所有結果加載到內存中。 50K文檔將占用大量客戶端內存,並且在分配該內存時也不會非常有效。
如果你堅持使用10gen Java驅動程序,那么你將需要等待JAVA-709解決流寫入功能。 異步Java驅動程序支持寫入流的功能。
如果你可以使用外部程序,你可能想看看mongoexport 。 它可以將JSON寫出到文件或標准輸出,並且應該接近最佳性能。
第一次運行查詢時,頁面錯誤是正常的。 第二次,如果服務器有足夠的內存來將整個數據集保存在內存中,您應該會看到很少的頁面錯誤。 如果您在與服務器相同的計算機上運行客戶端,則可能會將數據推出內存以在客戶端中為JSON blob分配所需的內存。
HTH - Rob
事實證明它與mongo shell一樣長。 當我從shell測試時,結果必須已經緩存,所以我認為我看到了更好的shell結果,但在我的情況下並非如此。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.