programing

오버플로우 정렬 단계 버퍼링된 데이터 사용량이 내부 제한을 초과합니다.

i4 2023. 3. 22. 20:43
반응형

오버플로우 정렬 단계 버퍼링된 데이터 사용량이 내부 제한을 초과합니다.

코드 사용:

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.pymongo.pymongo.matOperation Failure: 데이터베이스 오류: 러너 오류:오버플로우 정렬 단계 버퍼링된 데이터 사용량 33554495바이트가 내부 제한인 33554432바이트를 초과합니다.

어떻게 하면 좋을까요?

메모리 내 정렬에 32MB 제한이 있습니다.

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

정렬 필드에 인덱스를 추가합니다.이것에 의해, MongoDB는 문서를 모두 서버의 메모리에 로드해, 클라이언트에 송신하기 전에 메모리로 정렬하는 것이 아니라, 정렬된 순서로 당신에게 스트리밍 할 수 있습니다.

말한 바와 같이kumar_harsh댓글란에 포인트를 하나 더 추가하겠습니다.

다음 명령을 사용하여 현재 버퍼 사용량을 볼 수 있습니다.admin데이터베이스:

> use admin
switched to db admin
> db.runCommand( { getParameter : 1, "internalQueryExecMaxBlockingSortBytes" : 1 } )
{ "internalQueryExecMaxBlockingSortBytes" : 33554432, "ok" : 1 }

기본값은 32MB(33554432바이트)입니다.이 경우 버퍼 데이터가 부족하기 때문에 정의된 최적값(예: 50MB)으로 버퍼 제한을 늘릴 수 있습니다.

>  db.adminCommand({setParameter: 1, internalQueryExecMaxBlockingSortBytes:50151432})
{ "was" : 33554432, "ok" : 1 }

이 제한은 mongodb config 파일에서 다음 파라미터를 사용하여 영속적으로 설정할 수도 있습니다.

setParameter=internalQueryExecMaxBlockingSortBytes=309715200

도움이 되길 바랍니다!!!

Note: 이 명령어는 버전 3.0 이후에만 지원됩니다.

인덱스로 해결하다

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

인덱스를 생성하지 않으려면(예: 데이터를 탐색하기 위해 신속하게 더티 검사를 수행하려는 경우) Disk 사용량과 함께 집계를 사용할 수 있습니다.

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

(단, pymongo에서는 어떻게 하는지 잘 모르겠습니다.)

인덱스의 JavaScript API 구문:

db_handle.ensureIndex({executedDate: 1})

제 경우 코드 내에서 네서리 인덱스를 수정하고 다시 작성해야 했습니다.

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 } )

또한 필요할 수 있습니다.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() } )

언급URL : https://stackoverflow.com/questions/27023622/overflow-sort-stage-buffered-data-usage-exceeds-internal-limit

반응형