2016-11-04 3 views
0

Pongongo 3.3.0을 사용하여 mongo (v3.2.10) 컬렉션에서 많은 수의 (예 : 1 억 개) 문서를 가져 와서 반복해야합니다. 반복에는 며칠이 걸리며 시간이 초과 된 커서 때문에 종종 예외가 발생합니다.시간 초과를 피하기 위해 pymongo 커서 'touch'

필자가 반복 할 때 예측할 수없는 시간 동안 잠을 자야한다. 예를 들어 내가해야 할 수도 있습니다 그래서 :

    : - 나는 내가 할 수있는 알고 한 문서 등

    를 가져 - 일초 위해 수면 - - 10 개 문서 를 가져 4시간 수면 - 1000 문서를 를 가져

  • 시간 제한을 완전히 사용하지 않도록 설정합니다. 가능한 경우 코드가 완전히 작동하지 않는 경우 커서를 정리하는 것이 좋습니다.
  • 커서의 배치 크기를 줄이지 만 예를 들어 도움이되지 않습니다. 위의 예제에서와 같이 4 시간 동안 잠을 자야합니다.

좋은 솔루션 인 것처럼 느껴질 수 있습니다. 예를 들어, 나는 긴 수면을 더 짧은 간격으로 분해하고 각 간격 사이에서 커서를 만질 것입니다.

나는 pymongo를 통해이 작업을 수행 할 방법을 찾지 못했지만 가능한지 여부를 확실히 아는 사람이 있는지 궁금합니다.

답변

2

확실히 불가능합니다. 기능이 구현되지 않은 SERVER-6036입니다.

이러한 장기 실행 작업의 경우 인덱싱 된 필드에 대한 쿼리를 사용하는 것이 좋습니다. 예 : 문서의 모든 타임 스탬프 "TS"가있는 경우 : 커서 완전히

documents = list(collection.find().sort('ts').limit(1000)) 
for doc in documents: 
    # ... process doc ... 

while True: 
    ids = set(doc['_id'] for doc in documents) 
    cursor = collection.find({'ts': {'$gte': documents[-1]['ts']}}) 
    documents = list(cursor.limit(1000).sort('ts')) 
    if not documents: 
     break # All done. 
    for doc in documents: 
     # Avoid overlaps 
     if doc['_id'] not in ids: 
      # ... process doc ... 

이 코드의 반복을, 그래서 시간이 초과하지 않는 다음 다음 1000 문서를 처리하는 다음 1000

초 동안 반복 아이디어 : a very long cursor timeout으로 서버를 구성 :

mongod --setParameter cursorTimeoutMillis=21600000 # 6 hrs 

세 번째 아이디어 : 당신은 더 확신 할 수 아니지만 당신이에를 사용하여 비 제한 시간 커서를 닫습니다거야, 완전히 특정 461,913,210 문 :

cursor = collection.find(..., no_cursor_timeout=True) 
with cursor: 
    # PyMongo will try to kill cursor on server 
    # if you leave this block. 
    for doc in cursor: 
     # do stuff.... 
+0

하지만 내 경우에는 내가 꽤 복잡한 쿼리를 가지고 있고 나는 신선한 쿼리 때마다 다시 시작하지 않으려는 가능하면 예 그 패턴에 유용합니다 - 나는 하나를 유지하고 싶습니다 커서가 서버에 여하튼 열립니다 – nonagon

+0

내 대답을 업데이트했습니다. 당신은 "누군가가 그것이 가능한지 확실하게 알고 있는지"물었고 결정적으로 대답했습니다. =) –

+0

귀하의 답변은 실제로 완료되었으므로이를 수락합니다. 나는 집중된 질문을 할 때마다 "나는 X를 어떻게 할 것인가?"라는 질문을 할 때마다 항상 "당신은 X를하고 싶지 않습니다"라고 말하는 백만 개의 화가 반응을 얻기 때문에 나는 단지 스택 넘치는 애완 동물을 가지고 있다고 생각합니다. 물론 Y 또는 Z는 제 경우에는 가능하지 않지만 그것을 설명하기에는 너무 많은 맥락을 취할 것입니다 :). 어쨌든 그것은 정말로 도움이되는 답변에 감사드립니다! – nonagon

관련 문제