5

Ich habe eine Pandas-Datenrahmen mit einer losen Wrapper-Klasse, die Metadaten für meine Django/DRF-Anwendung bereitstellt. Die Anwendung ist im Grunde eine benutzerfreundliche (nicht Programmierer) Möglichkeit, einige Datenanalyse und Validierung zu tun. Zwischen den Anfragen möchte ich den Zustand des Datenrahmens speichern können, so dass ich eine Reihe von Interaktionen mit den Daten haben kann, aber er muss nicht in einer Datenbank gespeichert werden (er muss nur so lange überleben wie die Browsersitzung). Von daher war es logisch, djangos Sitzungsframework zu überprüfen, aber von dem, was ich gehört habe, sollten Sitzungsdaten leichtgewichtig sein und das Datenframe-Objekt wird nicht serialisiert.Zugriff auf Pandas Dataframe-Objekt zwischen Anfragen über Sitzungsschlüssel

Da ich nicht viele Benutzer habe und ich möchte, dass sich die App wie eine Desktop-Site anfühlt, habe ich überlegt, den django-Cache zu verwenden, um das Dataframe-Objekt im Speicher zu behalten. So setzt die Daten im Cache wäre so etwas wie dies

>>> from django.core.cache import caches 
>>> cache1 = caches['default'] 
>>> cache1.set(request.session._get_session_key, dataframe_object) 

und dann die gleich, außer der Verwendung get in den folgenden Anträgen auf Zugang zu gehen. Ist dies ein guter Weg, um diesen Workflow zu bewältigen oder gibt es ein anderes System, das ich verwenden sollte, um ziemlich große Daten (5 MB bis 100 MB) im Speicher zu halten?

Antwort

2

Wenn Sie Ihre Anwendung auf einem modernen Server ausführen, dann ist 100mb keine große Menge an Speicher. Wenn Sie jedoch mehr als ein paar Dutzend gleichzeitige Benutzer mit jeweils 100 MB Cache haben, kann dies zu mehr Speicher führen, als Ihr Server bewältigen kann. Ihr Cache und Server sollten entsprechend konfiguriert sein, und Sie möchten möglicherweise die Gesamtzahl der zwischengespeicherten Datenrahmen in Ihrem Python-Code begrenzen.

Da es scheint, dass Django Sitzungsdaten serialisieren muss, können Sie entweder Sitzungen mit PickleSerializer verwenden oder den Cache verwenden. Gemäß der Dokumentation wird PickleSerializer aus Sicherheitsgründen nicht empfohlen, daher ist die Wahl, den Cache zu verwenden, ein guter.

Das standardmäßige Cache-Back-End in Django teilt keine Einträge über Prozesse hinweg, sodass Sie durch die Installation von memcached und die Aktivierung des memcached.MemcachedCache-Backends eine bessere Speicher- und Zeiteffizienz erzielen.