2014-12-02 7 views
13

Mam dużą strukturę danych tylko do odczytu (wykres załadowany w siecix, choć to nie powinno być ważne), którego używam w moim serwisie internetowym. Usługa internetowa jest wbudowana w Flask, a następnie obsługiwana przez Gunicorn. Okazuje się, że dla każdego pracownika Gunicorn, który się rozpędzam, to działa, posiada własną kopię mojej struktury danych. Tak więc moja struktura danych ~ 700mb, która jest doskonale zarządzalna z jednym robotnikiem zamienia się w całkiem sporą pamięć, kiedy mam 8 uruchomionych. Czy istnieje sposób, w jaki mogę dzielić tę strukturę danych pomiędzy procesami gunicorn, więc nie muszę marnować tak dużo pamięci?Udostępnianie pamięci w Gunicorn?

+0

Czy rozważałeś użycie czegoś takiego jak Redis do przechowywania danych i dostępu do nich z każdego procesu? Byłoby bardzo podobne do wspólnej pamięci, jeśli chodzi o prędkość. – nathancahill

+0

Chciałbym, ale mówimy o skomplikowanym wykresie, który nie ma łatwego sposobu przechowywania w Redis (Redis nie ma obecnie ukierunkowanych grafów krawędzi lub ogólnego wsparcia AFAIK). – Eli

+1

Czy to rozwiązanie działa? Jeśli tak, możesz mi powiedzieć dokładnie, jak to zrobiłeś? – neel

Odpowiedz

6

Wygląda na to, że najprościej to zrobić: tell gunicorn to preload your application przy użyciu opcji preload_app. Zakłada się, że można załadować strukturę danych jako zmienną moduł poziomie:

from flask import Flask 
from your.application import CustomDataStructure 

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

# @app.routes, etc. 

Alternatywnie, można użyć memory-mapped file (jeśli można owinąć pamięci współdzielonej z niestandardowej struktury danych), gevent with gunicorn aby zapewnić, że używa się tylko jednego procesu lub the multi-processing module to spin up your own data-structure server, z którym łączy się za pomocą IPC.

+0

Opcja wstępnego ładowania nie działa, czy możesz podać przykład użycia jej z pewną sztuczną strukturą danych? – neel

+0

@neel - prawdopodobnie lepiej zadać inne pytanie z przykładem konfiguracji i niedziałającą. –

+0

Wysłałem pytanie tutaj http://stackoverflow.com/questions/35914587/how-to-get-a-concurreny-of-1000-requests-with-flask-and-gunicorn Byłoby świetnie, gdybyś wyglądał w tym momencie. Z góry dziękuję. – neel

Powiązane problemy