Используя код:
all_reviews = db_handle.find().sort('reviewDate', pymongo.ASCENDING)
print all_reviews.count()
print all_reviews[0]
print all_reviews[2000000]
Счетчик печатает 2043484
, и он печатает all_reviews[0]
.
Однако при печати all_reviews[2000000]
я получаю сообщение об ошибке:
pymongo.errors.OperationFailure: ошибка базы данных: ошибка выполнения: использование буферизованных данных этапа сортировки переполнения 33554495 байтов превышает внутренний предел 33554432 байтов
Как мне с этим справиться?
mongodb
mongodb-query
mongodb-indexes
Sheetal_158
источник
источник
db.adminCommand({setParameter: 1, internalQueryExecMaxBlockingSortBytes: <limit in bytes>})
. Источник: askubuntu.com/questions/501937/…Как сказано
kumar_harsh
в разделе комментариев, я хотел бы добавить еще один момент.Вы можете просмотреть текущее использование буфера, используя следующую команду над
admin
базой данных:> use admin switched to db admin > db.runCommand( { getParameter : 1, "internalQueryExecMaxBlockingSortBytes" : 1 } ) { "internalQueryExecMaxBlockingSortBytes" : 33554432, "ok" : 1 }
Он имеет значение по умолчанию 32 МБ (33554432 байта). В этом случае у вас не хватает данных буфера, поэтому вы можете увеличить лимит буфера с вашим собственным определенным оптимальным значением, например 50 МБ, как показано ниже:
> db.adminCommand({setParameter: 1, internalQueryExecMaxBlockingSortBytes:50151432}) { "was" : 33554432, "ok" : 1 }
Мы также можем установить этот предел навсегда с помощью следующего параметра в файле конфигурации mongodb:
setParameter=internalQueryExecMaxBlockingSortBytes=309715200
Надеюсь это поможет !!!
Note
: Эти команды поддерживаются только после версии 3.0 +источник
решено с индексацией
db_handle.ensure_index([("reviewDate", pymongo.ASCENDING)])
источник
Если вы хотите избежать создания индекса (например, вам просто нужна быстрая проверка для изучения данных), вы можете использовать агрегирование с использованием диска:
all_reviews = db_handle.aggregate([{$sort: {'reviewDate': 1}}], {allowDiskUse: true})
(Хотя не знаю, как это сделать в пимонго).
источник
db_handle.aggregate(pipe, allowDiskUse=True)
. См. Этот вопрос для получения дополнительной информации!Синтаксис JavaScript API для индекса:
db_handle.ensureIndex({executedDate: 1})
источник
В моем случае нужно было исправить нужные индексы в коде и воссоздать их:
Поскольку переполнение памяти не происходит при наличии необходимого индекса поля.
PS До этого приходилось отключать ошибки при создании длинных индексов:
# mongo MongoDB shell version: 2.6.12 connecting to: test > db.getSiblingDB('admin').runCommand( { setParameter: 1, failIndexKeyTooLong: false } )
Также могут понадобиться
reIndex
:# mongo MongoDB shell version: 2.6.12 connecting to: test > use your_db switched to db your_db > db.getCollectionNames().forEach( function(collection){ db[collection].reIndex() } )
источник