Flask чрезвычайно медленно запрашивает MongoLab

У меня есть база данных Mongolab, содержащая коллекцию документов небольших временных рядов.

Каждый документ содержит срез определенного временного ряда (250 дневных значений цен для определенной акции в каждом документе). Коллекция индексируется в поле запроса.

Мне нужно запросить все срезы, связанные с одной конкретной акцией, например:

cursor = db.timeseries.find({'stock':'IBM'})    # this line executes in very small time
slices = [slice for slice in cursor]            # this line takes 10 seconds

# to give an idea, cursor.count() could be anywhere between 10 and 40

Если я запускаю этот код в интерпретаторе Python, он завершается менее чем за 300 мс.

Если я запускаю тот же код в той же базе данных в Flask, работающем локально, это занимает 10 секунд (!!!). Проблема заключается не в выборе данных с помощью find(), который отлично работает, а в запросе всех данных обратно.

Примечательно, что если я подключаю локальное приложение Flask к локальной базе данных mongodb, оно работает нормально.

Я не нашел подобной проблемы, связанной с Flask, упомянутой в Интернете. Любые подсказки?


person Pythonic    schedule 07.09.2015    source источник
comment
Вы указываете имя хоста? Или IP-адрес?   -  person all or None    schedule 08.09.2015
comment
В начале приложения я указываю app.config['MONGO_URI'] = 'mongodb://<username>:<password>@dsxxxxxx.mongolab.com:55802/<dbname>'   -  person Pythonic    schedule 08.09.2015
comment
Это может быть проблема поиска DNS. Попробуйте подключиться к IP вместо имени хоста, например 50.19.86.168 вместо dsxxxxxx.mongolab.com. Разрешение IP может занять много времени.   -  person all or None    schedule 08.09.2015
comment
Спасибо, интересно. Ниже показано, как я ее решил, может ли быть связана проблема с flask-pymongo?   -  person Pythonic    schedule 08.09.2015
comment
Странный. Попробуйте медленный код с фиксированным IP и посмотрите, поможет ли это.   -  person all or None    schedule 08.09.2015
comment
Mongolab заявили, что не могут предоставить фиксированный IP-адрес. Я каким-то образом обошел это, улучшив индексацию для конкретных данных, как подробно описано в этот пост   -  person Pythonic    schedule 10.09.2015


Ответы (1)


Я решил это несколько наивным способом:

Вместо того, чтобы полагаться на Flask-PyMongo, я просто использовал простой pymongo в приложении flask, как обычно, и работает очень быстро:

Быстро — версия pymongo

# use pymongo in a classic way

mongolab_uri = 'mongodb://<username>:<password>@dsxxxxxx.mongolab.com:55802/<dbname>'
connection = pymongo.MongoClient(host=mongolab_uri)        
db = connection['<dbname>']
coll = db.<collection_name>

# from here query and do whatever you need to  

Медленно — версия Flask-Pymongo

from flask.ext.pymongo import PyMongo
app.config['MONGO_URI'] = 'mongodb:...'
mongo = PyMongo(app)
coll = mongo.db.<collection_name>
person Pythonic    schedule 08.09.2015
comment
Вы когда-нибудь понимали, почему это произошло? - person Paulo Matos; 27.07.2017
comment
Не совсем, я переделал доказательство концепции с pymongo, и все заработало нормально. - person Pythonic; 27.07.2017