Тайм-аут pymongo.find () работает, но работает с лимитом того же объема, что и коллекция - PullRequest
1 голос
/ 22 октября 2019

Прямо сейчас сталкиваюсь с довольно странной проблемой, с которой мне бы хотелось помочь. По какой-то причине приведенный ниже код запускается, когда я добавляю бессмысленное ограничение (как количество документов в коллекции), но когда я удаляю ограничение, несмотря на то, что результат равен тому же объему, время ожидания запроса истекает. Любая помощь очень ценится!

from pymongo import MongoClient
import pandas as pd

mongodb = MongoClient('mongodb://%s:%s@%s:%s' % (username, password, host, port))

numdocs = mongodb[collection].count_documents({})
##800,000

#Runs in 11.7s
results = pd.DataFrame(list(mongodb[collection].find({}).limit(numdocs)))

#Times out, or runs 1hr+ mins
results = pd.DataFrame(list(mongodb[collection].find({})))

ОБНОВЛЕНИЕ 10/22

Благодаря рекомендациям @ phalanx о выполнении операторов объяснения, похоже, что основная причина этого - выигрышный план Пимонго, различающийся междудва запроса:

mongodb[collection].find({}).explain()

"""{'queryPlanner': {'plannerVersion': 1,
'namespace': 'mongodb.collection',
'winningPlan': {'stage': 'COLLSCAN'}},
'serverInfo': {'host': 'mongodbhost',
'port': 27017,
'version': '3.6.0'},
'ok': 1.0}"""

mongodb[collection].find({}).limit(numdocs).explain()
"""
{'queryPlanner': {'plannerVersion': 1,
'namespace': 'mongodb.collection',
'winningPlan': {'stage': 'SUBSCAN',
'inputStage': {'stage': 'LIMIT_SKIP',
'inputStage': {'stage': 'COLLSCAN'}}}},
'serverInfo': {'host': 'mongodbhost',
'port': 27017,
'version': '3.6.0'},
'ok': 1.0}"""

Я собираюсь пока оставить этот вопрос открытым, поскольку, хотя у меня теперь есть лучшее представление о том, что происходит, было бы замечательно, если бы кто-то мог ответить:

  1. Почему другой выигрышный план запроса?
  2. Почему этот другой план намного медленнее?

Планируя открыть билет на Git Pymongo, просто хочуубедитесь, что здесь нет никаких очевидных шагов настройки, которые я пропускаю.

1 Ответ

2 голосов
/ 22 октября 2019

Вы пытались выполнить свой запрос с помощью .explain ("executeStats"), чтобы попытаться выяснить, что происходит?

...