Прохождение курсора на пимонго за бесконечное время - PullRequest
0 голосов
/ 01 апреля 2019

Я использую pymongo для доступа к данным с сервера mongo. На сервере находятся миллиарды документов. Поэтому я использую команды find и skip для одновременного доступа к n ​​документам. Мне нужно получить доступ только к тем документам, которые имеют "sample_key_XYZ" как _tag.

print('start',datetime.datetime.now())
a=db.collection.find({"_tag":re.compile('latest')}).skip(2000000).limit(2000)
print('end',datetime.datetime.now())

Работает нормально, курсор перемещается за секунду. Но когда я попытался получить доступ к данным, он завис (занимает несколько часов) * 1004 т.е. *

print('start',datetime.datetime.now())

    a=db.collection.find({"_tag":re.compile('sampe_key')}).skip(2000000).limit(2000)
    for doc in a:
        print(doc["_tag"])
        break
    print('end',datetime.datetime.now())

но если я изменяю пропуск на небольшое число (2500), он выполняется очень быстро (1с)

('start', datetime.datetime (2019, 4, 1, 16, 59, 3, 685992)) («конец», datetime.datetime (2019, 4, 1, 16, 59, 3, 686293)) когда используется без прохождения документа.

1 Ответ

1 голос
/ 01 апреля 2019

Исходя из вашего описания, особенно из-за того, что оно сильно замедляется по мере увеличения пропусков, я подозреваю, что вы решаете эту проблему .Посмотрите описание в билете и проверьте, видите ли вы большое количество отсканированных объектов / документов.Исходя из моего опыта, это вероятная проблема, с которой вы столкнулись - в основном MongoDB извлекает документы до того, как пропускает их.

Если это действительно так, то исправление заключается в обновлении до более поздней версии 3.6.так как эта проблема была исправлена ​​в 3.6.9.

...