programing

pymongo.pymongo.pymongo.matCursorNotFound: 커서 ID '...'이(가) 서버에서 유효하지 않습니다.

cafebook 2023. 2. 22. 23:12
반응형

pymongo.pymongo.pymongo.matCursorNotFound: 커서 ID '...'이(가) 서버에서 유효하지 않습니다.

다음 코드를 사용하여 mongo 데이터베이스에 존재하는 ID를 가져오려고 합니다.

client = MongoClient('xx.xx.xx.xx', xxx)
db = client.test_database
db = client['...']
collection = db.test_collection
collection = db["..."]


for cursor in collection.find({ "$and" : [{ "followers" : { "$gt" : 2000 } }, { "followers" : { "$lt" : 3000 } }, { "list_followers" : { "$exists" : False } }] }): 
    print cursor['screenname']
    print cursor['_id']['uid']
    id = cursor['_id']['uid']

그러나 잠시 후 다음 오류가 나타납니다.

pymongo.pymongo.pymongo.matCursorNotFound: 커서 ID '...'이(가) 서버에서 유효하지 않습니다.

나는 그 문제를 언급하는 이 기사를 발견했다.그럼에도 불구하고 나는 어떤 해결책을 취해야 할지 명확하지 않다.사용할 수 있습니까?find().batch_size(30)위의 명령어는 정확히 어떤 역할을 합니까?다음을 사용하여 모든 데이터베이스 ID를 가져올 수 있습니까?batch_size?

이 에러는, 커서가 서버상에서 타임 아웃 하고 있기 때문에 표시됩니다(비액티브 상태가 10분 경과한 후).

pymongo 문서:

MongoDB의 커서는 장시간 열려 있으면 서버에서 시간 초과가 발생할 수 있습니다.이로 인해 커서를 반복하려고 할 때 CursorNotFound 예외가 발생할 수 있습니다.

를 호출할 때collection.find메소드를 사용하여 컬렉션을 쿼리하고 문서에 커서를 반환합니다.문서를 가져오려면 커서를 반복합니다.커서 위에서 반복하면 드라이버는 실제로 MongoDB 서버에 더 많은 데이터를 가져오도록 요청을 하고 있습니다.각 요청에서 반환되는 데이터의 양은batch_size()방법.

매뉴얼에서 다음 항목을 참조하십시오.

한 배치에서 반환되는 문서 수를 제한합니다.각 배치에는 서버까지의 왕복이 필요합니다.성능을 최적화하고 데이터 전송을 제한하도록 조정할 수 있습니다.

batch_size를 낮은 값으로 설정하면 시간 초과 오류에 도움이 되지만 모든 문서를 가져오기 위해 MongoDB 서버에 액세스하는 횟수가 증가합니다.

기본 배치 크기:

대부분의 쿼리의 경우 첫 번째 배치는 101개의 문서를 반환하거나 1메가바이트를 초과하는 문서만 반환합니다.배치 크기는 최대 BSON 문서 크기(16MB)를 초과하지 않습니다.

범용 "올바른" 배치 크기는 없습니다.다양한 값을 사용하여 테스트하고 사용 사례에 적합한 값(즉, 10분 동안 처리할 수 있는 문서 수)을 확인해야 합니다.

마지막 수단은 당신이 설정하는 것입니다.no_cursor_timeout=True단, 데이터 처리가 완료된 후 커서가 닫혀 있는지 확인해야 합니다.

하나요?try/except:

cursor = collection.find(
     {"x": 1},
     no_cursor_timeout=True
)
for doc in cursor:
    # do something with doc
cursor.close()

, 「타임 아웃이 되지 않게」를 합니다.no_cursor_timeout=True음음음같 뭇매하다

cursor=db.images.find({}, {'id':1, 'image_path':1, '_id':0}, no_cursor_timeout=True)
for i in cursor:
    # .....
    # .....
cursor.close() # use this or cursor keeps waiting so ur resources are used up

을 '하다'라고 .timeout문서에 따라 대체되었습니다.지원하는 방법에 대한 자세한 옵션no_cursor_timeout pymongo 문서에서 이 검색 결과를 참조하십시오.

시간 초과(약 10분)보다 더 많이 커서를 사용했기 때문에 커서가 더 이상 존재하지 않습니다.

문제를 해결하려면 낮은 값인 batch_size를 선택해야 합니다.

(예를 들어 Pymongo 사용)

col.find({}).batch_size(10)

또는

col.find(timeout=False)★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★♪

이것은 타임아웃 문제입니다.기본적으로 mongodb에서는 10분입니다.mongo에 로그인하여 admin 쿼리 업데이트를 실행하여 이 문제를 해결하고 싶습니다.

use admin 
db.runCommand({setParameter:1, cursorTimeoutMillis: 1800000})

여기서 1800000은 30분에 해당하며, 이 정도면 내 사용 사례에 충분합니다.

또는 터미널(10800000==3h):

sudo mongod --setParameter cursorTimeoutMillis=10800000

★★batch_sizefind방법이치노이러한 레코드는 10분(기본 서버 커서 타임아웃)보다 빠르게 처리되어야 합니다.그렇지 않으면 서버에서 커서가 닫힙니다.
, 「」의 값입니다.batch_size을 사용하다

collection.find({...}, batch_size=20)

커서 오브젝트를 목록으로 변환한 후 사용할 수 있습니다.이것에 의해, 실제로 그 커서에서 콜을 발신하지 않게 되어, 로컬 리스트로부터 콜을 발신할 수 있게 됩니다.따라서 코드에서 해당 커서로 작업을 수행하는 데 걸리는 시간은 단순히 커서를 목록에 복사하는 시간보다 훨씬 더 오래 걸립니다.따라서 목록에 복사하는 동안 타임아웃될 확률은 매우 낮습니다.따라서 작업이 완료되면 특정 시간이 지나면 타임아웃되지만 더 이상 참조하지 않고 자신의 목록을 사용하게 됩니다.

Cursor = collection.find({ "$and" : [{ "followers" : { "$gt" : 2000 } }, { "followers" : { "$lt" : 3000 } }, { "list_followers" : { "$exists" : False } }] })
Cursor = [x for x in Cursor]

이제 이 목록에 있는 모든 레코드를 가져왔습니다.

(예:

for i in Cursor:
    print(i['screenname'])

언급URL : https://stackoverflow.com/questions/24199729/pymongo-errors-cursornotfound-cursor-id-not-valid-at-server

반응형