Usando o código:
all_reviews = db_handle.find().sort('reviewDate', pymongo.ASCENDING)
print all_reviews.count()
print all_reviews[0]
print all_reviews[2000000]
A contagem é impressa 2043484
e impressa all_reviews[0]
.
No entanto, ao imprimir all_reviews[2000000]
, recebo o erro:
pymongo.errors.OperationFailure: erro do banco de dados: Erro do executor: O uso de dados em buffer do estágio de classificação de estouro de 33554495 bytes excede o limite interno de 33554432 bytes
Como faço para lidar com isso?
mongodb
mongodb-query
mongodb-indexes
sheetal_158
fonte
fonte
db.adminCommand({setParameter: 1, internalQueryExecMaxBlockingSortBytes: <limit in bytes>})
. Fonte: askubuntu.com/questions/501937/…Como disse
kumar_harsh
na seção de comentários, gostaria de acrescentar outro ponto.Você pode ver o uso atual do buffer usando o comando abaixo no
admin
banco de dados:> use admin switched to db admin > db.runCommand( { getParameter : 1, "internalQueryExecMaxBlockingSortBytes" : 1 } ) { "internalQueryExecMaxBlockingSortBytes" : 33554432, "ok" : 1 }
Ele tem um valor padrão de 32 MB (33554432 bytes) . Nesse caso, você está ficando sem dados do buffer, então pode aumentar o limite do buffer com seu próprio valor ideal definido, por exemplo, 50 MB conforme abaixo:
> db.adminCommand({setParameter: 1, internalQueryExecMaxBlockingSortBytes:50151432}) { "was" : 33554432, "ok" : 1 }
Também podemos definir esse limite permanentemente pelo parâmetro abaixo no arquivo de configuração mongodb:
setParameter=internalQueryExecMaxBlockingSortBytes=309715200
Espero que isto ajude !!!
Note
: Este comando suporta apenas após a versão 3.0 +fonte
resolvido com indexação
db_handle.ensure_index([("reviewDate", pymongo.ASCENDING)])
fonte
Se você deseja evitar a criação de um índice (por exemplo, deseja apenas uma verificação rápida e suja para explorar os dados), pode usar a agregação com o uso do disco:
all_reviews = db_handle.aggregate([{$sort: {'reviewDate': 1}}], {allowDiskUse: true})
(Não tenho certeza de como fazer isso em pymongo, no entanto).
fonte
db_handle.aggregate(pipe, allowDiskUse=True)
. Veja esta pergunta para mais informações!Sintaxe da API JavaScript para o índice:
db_handle.ensureIndex({executedDate: 1})
fonte
No meu caso, foi necessário corrigir os índices necessários no código e recriá-los:
Como o estouro de memória não ocorre quando há um índice de campo necessário.
PS Antes disso, eu tinha que desabilitar os erros ao criar índices longos:
# mongo MongoDB shell version: 2.6.12 connecting to: test > db.getSiblingDB('admin').runCommand( { setParameter: 1, failIndexKeyTooLong: false } )
Também pode ser necessário
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() } )
fonte