Загрузка большого файла GridFS приводит к сбою сервера Node.js. MongoServerError: сортировка превысила лимит байтов памяти

Итак, я запускаю сервер Node.js с мангустом и пытаюсь выполнить загрузить большой файл с помощью пакета узла GridFS, но получаю следующую ошибку:

MongoServerError: Executor error during find command :: caused by :: Sort exceeded memory limit of 104857600 bytes, but did not opt in to external sorting.

Вот код, который я использовал для загрузки файла:

// 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, я хотел бы задокументировать эту проблему, чтобы мое решение могло помочь другим, столкнувшимся с ней позже.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
15
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Оказывается, когда вы загружаете файл в потоковом режиме с помощью GridFS, документы, составляющие файл, сортируются. Согласно этот пост в блоге, при выполнении сортировки MongoDB сначала пытается получить документы, используя порядок, указанный в индексе.. Когда индекс недоступен, он попытается загрузить документы в память и отсортировать их там.

Загвоздка в том, что Mongo по умолчанию настроен на прерывание операции при превышении использования 32 МБ. Вот почему мы сталкиваемся с ошибкой «Сортировка превышена предела памяти», описанной выше. Чтобы решить эту проблему, вам нужно будет создать индекс для поля «n», который содержит порядок фрагментов файла., который вы хотите загрузить. Для этого вы можете либо создать индекс непосредственно через интерфейс вашей базы данных (я использую графический интерфейс MongoDB Compass), либо вы можете создать его с помощью кода, используя метод создатьиндекс():

// Create an index for the 'n' field to help sort the chunks collection.
db.collection('files.chunks').createIndex({n: 1});

Другие вопросы по теме