복붙노트

[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. ==============================

    1.당신은 메모리 종류에 32MB의 한계로 실행중인 :

    당신은 메모리 종류에 32MB의 한계로 실행중인 :

    https://docs.mongodb.com/manual/reference/limits/#Sort-Operations

    정렬 필드에 인덱스를 추가합니다. 즉 MongoDB를 오히려 클라이언트로 보내기 전에 메모리에 서버의 메모리에 모두로드를 시도하고 일종의 그들보다 정렬 된 순서로 당신에게 문서를 스트리밍 할 수 있습니다.

  2. ==============================

    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. ==============================

    3.인덱싱 해결

    인덱싱 해결

    db_handle.ensure_index([("reviewDate", pymongo.ASCENDING)])
    
  4. ==============================

    4.당신이 인덱스 (예를 들어, 당신은 단지 데이터를 탐색 더러운 빠른 및 검사를 원하는)을 생성하지 않도록하려면 디스크 사용량과 집계를 사용할 수 있습니다 :

    당신이 인덱스 (예를 들어, 당신은 단지 데이터를 탐색 더러운 빠른 및 검사를 원하는)을 생성하지 않도록하려면 디스크 사용량과 집계를 사용할 수 있습니다 :

    all_reviews = db_handle.aggregate([{$sort: {'reviewDate': 1}}], {allowDiskUse: true})
    

    (확실하지하지만, pymongo에서이 작업을 수행하는 방법).

  5. ==============================

    5.자바 스크립트 API는 인덱스에 대한 구문 :

    자바 스크립트 API는 인덱스에 대한 구문 :

    db_handle.ensureIndex({executedDate: 1})
    
  6. ==============================

    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() } )
    
  7. from https://stackoverflow.com/questions/27023622/overflow-sort-stage-buffered-data-usage-exceeds-internal-limit by cc-by-sa and MIT license