2014-12-02 3 views
13

У меня есть большая структура данных только для чтения (график, загруженный в networkx, хотя это не должно быть важно), который я использую в своей веб-службе. Вебсервис построен в Flask, а затем подается через Gunicorn. Оказывается, для каждого рабочего-стрелялка я раскручиваюсь, у него работает собственная копия моей структуры данных. Таким образом, моя структура данных размером ~ 700 Мб, которая отлично управляема с одним рабочим, превращается в довольно крупную память, когда у меня есть 8 из них. Есть ли способ поделиться этой структурой данных между процессами пушки, так что мне не нужно тратить столько памяти?Обмен памятью в Гуйкенкорне?

+0

Вы считали, что используете что-то вроде Redis для хранения данных и доступа к ним из каждого процесса? Было бы очень похоже на разделяемую память, насколько скорость идет. – nathancahill

+0

Я бы сказал, но мы говорим о сложном графе, что нет простого способа сохранить в Redis (у Redis нет ориентированных граничных графов или общей поддержки графика в настоящее время AFAIK). – Eli

+1

Решено ли решение для вас? Если да, вы можете подробно рассказать мне, как вы это сделали? – neel

ответ

6

Похоже, что самый простой способ сделать это - tell gunicorn to preload your application с использованием опции preload_app. Это предполагает, что вы можете загрузить структуру данных в качестве переменного уровня модуля:

from flask import Flask 
from your.application import CustomDataStructure 

CUSTOM_DATA_STRUCTURE = CustomDataStructure('/data/lives/here') 

# @app.routes, etc. 

В качестве альтернативы, вы можете использовать memory-mapped file (если вы можете обернуть разделяемую память с пользовательской структурой данных), gevent with gunicorn для того, чтобы вас используйте только один процесс или the multi-processing module to spin up your own data-structure server, с которым вы подключаетесь к IPC.

+0

параметр предварительной загрузки не работает, можете ли вы привести пример использования его с некоторой фиктивной структурой данных? – neel

+0

@neel - вам, вероятно, лучше задавать другой вопрос с примером вашей установки и тем, что не работает. –

+0

Я разместил вопрос здесь http://stackoverflow.com/questions/35914587/how-to-get-a-concurreny-of-1000-requests-with-flask-and-gunicorn Было бы здорово, если бы вы посмотрели у него один раз. Заранее спасибо. – neel

Смежные вопросы