Ошибка при извлечении больших данных с использованием GridFS (MongoDB)

Когда я пытаюсь получить файл, хранящийся в MongoDB, с помощью GridFS (300 МБ), я получаю сообщение об ошибке:

2014-07-16T22:50:10.201+0200 [conn1139] assertion 17144 Runner error: 
Overflow sort stage buffered data usage of 33563462 bytes exceeds internal limit of 33554432 bytes ns:myproject.export_data.chunks query:{ $query: { files_id: ObjectId('53c6e5485f00005f00c6bae6'), n: { $gte: 0, $lte: 1220 } }, $orderby: { n: 1 } }

Я нашел что-то похожее, но это уже исправлено: https://jira.mongodb.org/browse/SERVER-13611

Я использую MongoDB 2.6.3.


person Michał Jurczuk    schedule 16.07.2014    source источник


Ответы (2)


Не уверен, какой драйвер или версию драйвера вы используете, но ясно, что ваша реализация выдает «сортировку», и без индекса вы увеличиваете предел сортировки памяти в 32 МБ при извлечении фрагментов по диапазону.

Лучшие реализации драйверов этого не делают, а скорее «зацикливают» фрагменты с отдельными запросами. Но проблема здесь в том, что в вашей коллекции отсутствует индекс, в котором она нуждается, либо из-за вашей собственной настройки, либо из-за реализации драйвера, который создал эту коллекцию.

Кажется, вы назвали свое «корневое» пространство «export_data», поэтому переключитесь на базу данных, содержащую коллекции GridFS, и выполните следующие действия:

db.export_data.chunks.ensureIndex( { files_id: 1, n: 1 }, { unique: true } )

Или добавьте что-нибудь в код вашего приложения, чтобы обеспечить существование индекса.

person Neil Lunn    schedule 17.07.2014

Это не ошибка. Это явно связано с sort, как описано в сообщении об ошибке, а не с GridFS. Прочтите этот раздел об ограничении сортировки:

MongoDB будет возвращать отсортированные результаты только для полей без индекса, если операция сортировки использует менее 32 мегабайт памяти. Это означает, что ваша сортировка прерывается, если она использует более 32 МБ памяти без индекса.

Будет лучше, если вы сможете опубликовать операторы, которые вы выполняете.

person yaoxing    schedule 17.07.2014
comment
Я просто получаю данные с помощью gridfs (воспроизведение): val gfs = GridFS(db, DbConst.FILES_COLLECTION_NAME) serve(gfs, gfs.find(BSONDocument(_id -> new BSONObjectID(id)))) - person Michał Jurczuk; 19.07.2014