반응형
mongodb 커서 ID가 유효하지 않은 오류입니다.
이 루프를 반복하려고 합니다.
for doc in coll.find()
100,000번째 플러스 기록에서 다음과 같은 오류가 발생합니다.
File "build\bdist.win32\egg\pymongo\cursor.py", line 703, in next
File "build\bdist.win32\egg\pymongo\cursor.py", line 679, in _refresh
File "build\bdist.win32\egg\pymongo\cursor.py", line 628, in __send_message
File "build\bdist.win32\egg\pymongo\helpers.py", line 95, in _unpack_response
pymongo.errors.OperationFailure: cursor id '1236484850793' not valid at server
이 오류는 무엇을 의미합니까?
서버에서 커서 시간이 초과되었을 수 있습니다.이것이 문제인지 확인하려면 timeout=False'를 설정합니다.
for doc in coll.find(timeout=False)
http://api.mongodb.org/python/1.6/api/pymongo/collection.html#pymongo.collection.Collection.find 을 참조하십시오.
시간 초과 문제인 경우 가능한 해결책은 다음과 같이 설정하는 것입니다.batch_size
(s. 기타 답변).
- 설정
timeout=False
커서에 대한 연결이 무제한으로 열려 있을 수 있으므로 위험하며 절대 사용해서는 안 됩니다. 이는 시스템 성능에 영향을 미칠 수 있습니다.문서에서는 특히 커서를 수동으로 닫을 필요성을 언급합니다. - 설정
batch_size
적은 수의 경우에도 작동하지만 필요 이상으로 자주 DB에 액세스해야 하기 때문에 대기 시간 문제가 발생합니다.
예:
배치가 작은 5M개의 문서는 기본 batch_size가 몇 분 안에 반환하는 것과 동일한 데이터를 검색하는 데 몇 시간이 걸립니다.
내 솔루션에서는 커서에서 정렬을 사용해야 합니다.
done = False
skip = 0
while not done:
cursor = coll.find()
cursor.sort( indexed_parameter ) # recommended to use time or other sequential parameter.
cursor.skip( skip )
try:
for doc in cursor:
skip += 1
do_something()
done = True
except pymongo.errors.OperationFailure, e:
msg = e.message
if not (msg.startswith("cursor id") and msg.endswith("not valid at server")):
raise
설정timeout=False
아주 나쁜 관행입니다.커서 ID 시간 초과 예외를 제거하는 더 좋은 방법은 루프가 10분 내에 처리할 수 있는 문서 수를 추정하고 배치 크기를 유지하는 것입니다.이러한 방식으로 MongoDB 클라이언트(이 경우 PyMongo)는 이전 배치의 문서가 모두 사용될 때마다 가끔 서버를 쿼리해야 합니다.이렇게 하면 커서가 서버에서 활성 상태로 유지되고 10분 제한 시간 보호가 적용됩니다.
커서의 배치 크기를 설정하는 방법은 다음과 같습니다.
for doc in coll.find().batch_size(30):
do_time_consuming_things()
batch_size의 낮은 값을 선택하여 문제를 해결해야 합니다.
col.find({}).batch_size(10)
다음 답변 보기
다음을 사용하여 강제로 평가할 수도 있습니다.
for doc in list(coll.find())
언급URL : https://stackoverflow.com/questions/10298354/mongodb-cursor-id-not-valid-error
반응형
'source' 카테고리의 다른 글
SSL: Python3에서 CERTIFICATE_VERIFY_실패 (0) | 2023.05.04 |
---|---|
상위 1개 필드를 선택하고 로컬 변수에 할당 (0) | 2023.05.04 |
SQL Server에서 중위수 계산 기능 (0) | 2023.04.29 |
Eclipse에서 변수 이름을 빠르게 대문자로 바꿀 수 있는 방법이 있습니까? (0) | 2023.04.29 |
원하는 diff 도구/뷰어를 사용하여 'gitdiff' 출력을 보려면 어떻게 해야 합니까? (0) | 2023.04.29 |