Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: PythonicОтветов: 1

У меня есть база данных 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, упомянутой в Интернете. Любые подсказки?

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

pythonflaskmongodbpymongomlab

Ответы

Ответ 1 · рейтинг 1 · Pythonic

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

Вместо того, чтобы полагаться на 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>

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы