因此,我正在使用 mongoose 運行 Node.js 服務器,并且一直在嘗試使用 GridFS 節點包下載大檔案,但出現以下錯誤:
MongoServerError: 執行器錯誤在 find command :: 導致 :: Sort 超出了 104857600 位元組的記憶體限制,但沒有選擇外部排序。
這是我用來下載檔案的代碼:
// Stream a single file.
router.get('/stream/:filename', async function(req, res, next){
try{
const file = gfs.find({
filename: req.params.filename
}).toArray((err, files) => {
if (!files || files.length === 0) {
return res.status(404)
.json({
err: "no files exist"
});
}
gfs.openDownloadStreamByName(req.params.filename)
.pipe(res);
});
}catch(err){
return res.status(400).json({
err:'Could not fetch the file.'
})
}
});
鑒于可以在 StackOverflow 上回答您自己的問題,我想記錄這個問題,以便我的解決方案可以幫助其他人以后遇到它。
uj5u.com熱心網友回復:
事實證明,當您通過使用 GridFS 流式傳輸檔案來下載檔案時,構成檔案的檔案會被排序。根據這篇博客文章,在進行排序時,MongoDB 首先嘗試使用索引中指定的順序檢索檔案。當沒有可用的索引時,它會嘗試將檔案加載到記憶體中并在那里對其進行排序。
問題是 Mongo 默認配置為在超過 32 MB 的使用量時中止操作。這就是我們遇到上述“排序超出記憶體限制”錯誤的原因。為了解決這個問題,您必須為“n”欄位創建一個索引,其中包含您要下載的檔案塊的順序。為此,您可以直接通過資料庫界面創建索引(我使用 MongoDB Compass GUI),也可以使用createIndex()方法通過代碼創建索引:
// Create an index for the 'n' field to help sort the chunks collection.
db.collection('files.chunks').createIndex({n: 1});
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/476870.html
