source

mongodb 커서 ID가 유효하지 않은 오류입니다.

factcode 2023. 4. 29. 09:57
반응형

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

반응형