[MONGODB] 오버플로 정렬 단계 버퍼링 된 데이터의 사용은 내부 한계를 초과
MONGODB오버플로 정렬 단계 버퍼링 된 데이터의 사용은 내부 한계를 초과
코드를 사용하여 :
all_reviews = db_handle.find().sort('reviewDate', pymongo.ASCENDING)
print all_reviews.count()
print all_reviews[0]
print all_reviews[2000000]
카운트 2,043,484를 인쇄하며 all_reviews [0]를 출력한다.
그러나 인쇄 all_reviews [2000000]를, 나는 오류가 발생합니다 :
이걸 어떻게 처리하나요?
해결법
-
==============================
1.당신은 메모리 종류에 32MB의 한계로 실행중인 :
당신은 메모리 종류에 32MB의 한계로 실행중인 :
https://docs.mongodb.com/manual/reference/limits/#Sort-Operations
정렬 필드에 인덱스를 추가합니다. 즉 MongoDB를 오히려 클라이언트로 보내기 전에 메모리에 서버의 메모리에 모두로드를 시도하고 일종의 그들보다 정렬 된 순서로 당신에게 문서를 스트리밍 할 수 있습니다.
-
==============================
2.코멘트 섹션에서 kumar_harsh가 말했듯이, 나는 또 다른 지점을 추가하고 싶습니다.
코멘트 섹션에서 kumar_harsh가 말했듯이, 나는 또 다른 지점을 추가하고 싶습니다.
당신은 관리자 데이터베이스를 통해 아래의 명령을 사용하여 현재 버퍼 사용량을 볼 수 있습니다 :
> use admin switched to db admin > db.runCommand( { getParameter : 1, "internalQueryExecMaxBlockingSortBytes" : 1 } ) { "internalQueryExecMaxBlockingSortBytes" : 33554432, "ok" : 1 }
그것은 당신이 50메가바이트 아래로, 자신의 정의 최적의 값으로 제한 버퍼 예를 높일 수 있도록 버퍼 데이터의 짧은 실행하고이 경우 .IN 32메가바이트 (33,554,432 바이트)의 기본값 :
> db.adminCommand({setParameter: 1, internalQueryExecMaxBlockingSortBytes:50151432}) { "was" : 33554432, "ok" : 1 }
우리는 또한하여 MongoDB의 구성 파일에서 매개 변수 아래에 의해 영구적으로 제한을 설정할 수 있습니다 :
setParameter=internalQueryExecMaxBlockingSortBytes=309715200
희망이 도움이!
참고 :이 명령이 지원 후에 만 버전 3.0 +
-
==============================
3.인덱싱 해결
인덱싱 해결
db_handle.ensure_index([("reviewDate", pymongo.ASCENDING)])
-
==============================
4.당신이 인덱스 (예를 들어, 당신은 단지 데이터를 탐색 더러운 빠른 및 검사를 원하는)을 생성하지 않도록하려면 디스크 사용량과 집계를 사용할 수 있습니다 :
당신이 인덱스 (예를 들어, 당신은 단지 데이터를 탐색 더러운 빠른 및 검사를 원하는)을 생성하지 않도록하려면 디스크 사용량과 집계를 사용할 수 있습니다 :
all_reviews = db_handle.aggregate([{$sort: {'reviewDate': 1}}], {allowDiskUse: true})
(확실하지하지만, pymongo에서이 작업을 수행하는 방법).
-
==============================
5.자바 스크립트 API는 인덱스에 대한 구문 :
자바 스크립트 API는 인덱스에 대한 구문 :
db_handle.ensureIndex({executedDate: 1})
-
==============================
6.내 경우, 코드에 nessary 인덱스를 수정하고 다시 작성해야했습니다 :
내 경우, 코드에 nessary 인덱스를 수정하고 다시 작성해야했습니다 :
rake db:mongoid:create_indexes RAILS_ENV=production
필드의 필요한 인덱스가있을 때 메모리 오버 플로우가 발생하지 않기 때문에.
PS이 나는 오래 전에 인덱스를 만들 때 오류를 해제했다 :
# mongo MongoDB shell version: 2.6.12 connecting to: test > db.getSiblingDB('admin').runCommand( { setParameter: 1, failIndexKeyTooLong: false } )
또한 색인화 필요할 수 있습니다 :
# 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() } )
from https://stackoverflow.com/questions/27023622/overflow-sort-stage-buffered-data-usage-exceeds-internal-limit by cc-by-sa and MIT license
'MONGODB' 카테고리의 다른 글
[MONGODB] 배열의 모든 요소가 조건에 일치하는 경우 확인 (0) | 2019.12.02 |
---|---|
[MONGODB] 왜 Node.js를 코드에서 MongoDB를 연결 어느 곳을 폐쇄하지 않는 것이 좋습니다? (0) | 2019.12.02 |
[MONGODB] MongoDB를 - 페이징 (0) | 2019.12.02 |
[MONGODB] 이해 MongoDB를 BSON 문서 크기 제한 (0) | 2019.12.02 |
[MONGODB] MongoDB의 모든 쿼리를 로깅 (0) | 2019.12.02 |