2014-12-02 13 views
13

Ich habe eine große schreibgeschützte Datenstruktur (ein in networkx geladenes Diagramm, obwohl dies nicht wichtig sein sollte), die ich in meinem Webdienst verwende. Der Webservice wird in Flask gebaut und dann durch Gunicorn bedient. Es stellt sich heraus, dass für jeden Gunicorn-Arbeiter, den ich angeheuert habe, eine eigene Kopie meiner Datenstruktur funktioniert. So wird meine ~ 700mb Datenstruktur, die perfekt mit einem Arbeiter handhabbar ist, zu einem ziemlich großen Speicherschwein, wenn ich 8 davon laufen lasse. Gibt es eine Möglichkeit, diese Datenstruktur zwischen Gunicorn-Prozessen zu teilen, so dass ich nicht so viel Speicher verschwenden muss?Gemeinsame Speicher in Gunicorn?

+0

Haben Sie darüber nachgedacht, etwas wie Redis zu verwenden, um die Daten zu speichern und von jedem Prozess darauf zuzugreifen? Wäre der Geschwindigkeit so ähnlich wie Shared Memory. – nathancahill

+0

Ich würde, aber wir sprechen über eine komplexe Grafik, dass es keine einfache Möglichkeit gibt, in Redis zu speichern (Redis hat keine gerichteten Kanten Graphen oder allgemeine Graph Unterstützung derzeit AFAIK). – Eli

+1

Hat die Lösung für Sie funktioniert? Wenn ja, kannst du mich im Detail wissen, wie du es gemacht hast? – neel

Antwort

6

Es sieht so aus, als ob tell gunicorn to preload your application mit der preload_app Option der einfachste Weg ist. Dies setzt voraus, dass Sie die Datenstruktur als Variable auf Modulebene laden:

from flask import Flask 
from your.application import CustomDataStructure 

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

# @app.routes, etc. 

Alternativ können Sie ein memory-mapped file verwenden (wenn Sie den gemeinsam genutzten Speicher mit Ihrer benutzerdefinierten Datenstruktur wickeln kann), gevent with gunicorn um sicherzustellen, dass Sie Verwenden Sie nur einen Prozess oder the multi-processing module to spin up your own data-structure server, den Sie mit IPC verbinden.

+0

Preload-Option funktioniert nicht, können Sie ein Beispiel für die Verwendung mit einer Dummy-Datenstruktur bereitstellen? – neel

+0

@neel - Sie sind wahrscheinlich besser dran, eine andere Frage mit einem Beispiel für Ihre Einrichtung und was nicht funktioniert fragen. –

+0

Ich habe die Frage hier http://stackoverflow.com/questions/35914587/how-to-get-a-concurreny-of-1000-requests-with-flask-and-gunicorn geschrieben Es wäre toll, wenn Sie schauen bei ihm einmal. Danke im Voraus. – neel