복붙노트

[PYTHON] pymongo.errors.CursorNotFound : 서버에서 커서 ID '...'이 유효하지 않습니다.

PYTHON

pymongo.errors.CursorNotFound : 서버에서 커서 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']

그러나 잠시 후이 오류 메시지가 나타납니다.

나는 그 문제를 언급하는이 기사를 발견했다. 그럼에도 불구하고 어느 솔루션을 사용해야하는지 분명하지 않습니다. find (). batch_size (30)를 사용할 수 있습니까? 위의 명령은 정확히 무엇을합니까? batch_size를 사용하여 모든 데이터베이스 ID를 사용할 수 있습니까?

해결법

  1. ==============================

    1.커서가 서버에서 시간 초과되어 (10 분 동안 사용하지 않으면)이 오류가 발생합니다.

    커서가 서버에서 시간 초과되어 (10 분 동안 사용하지 않으면)이 오류가 발생합니다.

    pymongo 문서에서 :

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

    문서에서 :

    batch_size를 더 낮은 값으로 설정하면 타임 아웃 오류 오류에 도움이되지만 MongoDB 서버에 액세스하여 모든 문서를 가져 오는 횟수가 늘어납니다.

    기본 일괄 처리 크기 :

    범용 "올바른"배치 크기는 없습니다. 다른 값으로 테스트하고 유스 케이스에 적합한 값, 즉 10 분 동안 처리 할 수있는 문서의 수를 확인해야합니다.

    마지막 수단은 timeout = False로 설정하는 것입니다. 그러나 데이터 처리가 끝나면 커서가 닫혀 있는지 확인해야합니다.

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

    2.다음과 같이 no_cursor_timeout = True를 사용하십시오.

    다음과 같이 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
    
  3. ==============================

    3.커서를 시간 초과 (약 10 분) 이상 사용하여 커서가 더 이상 존재하지 않습니다.

    커서를 시간 초과 (약 10 분) 이상 사용하여 커서가 더 이상 존재하지 않습니다.

    batch_size 값을 낮게 선택하여 문제를 해결해야합니다.

    (예 : Pymongo 포함)

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

    또는

    timeout을 false col.find (timeout = False)로 설정하고 마지막에 커서를 닫는 것을 잊지 마십시오.

  4. from https://stackoverflow.com/questions/24199729/pymongo-errors-cursornotfound-cursor-id-not-valid-at-server by cc-by-sa and MIT license