2015-11-07 57 views
0

我想通過貓鼬訪問集合超過一百萬個文檔(1281034),但沒有成功。大集合時貓鼬錯誤

我已經試過這3種方式:

到整個集合

@find({},'_id n').exec (error, value) -> 

Mongoose: items.find({}) { fields: { n: 1, _id: 1 } }

有了限制正常訪問,這工作,但99999(最大允許)限制其不夠

@find({},'_id n').limit(99999).exec (error, value) -> 

Mongoose: items.find({}) { limit: 99999, fields: { n: 1, _id: 1 } }

With a stre上午,這也適用,但給出了一個內存不足的錯誤

stream = @find({},'_id n').stream() 
stream.on('data', (doc)-> 
    results.push doc 
    console.log "#{results.length}" 
    ).on('close', -> 
     console.log "Finished : #{results.length}" 
    ) 

在崩潰415786個文件:(致命錯誤:CALL_AND_RETRY_LAST分配失敗 - 進程內存不足)

+3

爲什麼你想把所有的百萬+文檔放到內存數組中?可能有更好的方法來做你最終想做的事情。 – JohnnyHK

+0

將它們緩存在另一個存儲系統(如redis)中。 @JohnnyHK – Imnl

+0

那麼爲什麼不擴大你的流式方法來添加文檔到redis,因爲你在''data''回調中接收它們,而不是將它們全部存儲在數組中? – JohnnyHK

回答

0

最後我的解決辦法是避免存儲記憶作爲查詢結果的百萬個項目。我發現最好的方法是使用NodeJS流,因此我不需要使用大量的內存。

stream = @find({}).stream() 
stream.on('data', (doc)-> 
Redis.push('items',JSON.stringify(doc)) 
) 

如果你想要一個更可讀的方式你也可以鏈.pipe()方法,並通過它writeableStream