Vermeiden Sie das erneute Laden von DataFrame zwischen verschiedenen Python-Kerneln


10

Gibt es eine Möglichkeit, eine Variable (große Tabelle / Datenrahmen) im Speicher zu behalten und für mehrere Ipython-Notizbücher freizugeben?

Ich würde nach etwas suchen, das konzeptionell den persistenten Variablen von MATLAB ähnlich ist. Dort ist es möglich, eine benutzerdefinierte Funktion / Bibliothek von mehreren einzelnen Editoren (Notizbüchern) aufzurufen und diese externe Funktion ein Ergebnis (oder eine große Tabelle) zwischenspeichern zu lassen.

Meistens möchte ich vermeiden, eine häufig verwendete Tabelle neu zu laden (die über eine benutzerdefinierte Bibliothek geladen wird, die aus den Notizbüchern aufgerufen wird), da das Lesen bei jedem Start einer neuen Analyse etwa 2-3 Minuten dauert.


1
Dies scheint nicht möglich zu sein und kann viele Kopfschmerzen verursachen, wenn Sie nicht vorsichtig sind. Ist es keine Option , die Daten in einem effizienten Format wie msgpack zu speichern ?
Emre

@ Emmre Danke. Ein schwieriger Teil von msgpack ist, dass es das zugrunde liegende Problem des Lesens der Tabelle nicht löst. Es ist auch ein zweischneidiges Schwert: Während es im Vergleich zum Originalformat der Tabelle etwa 40% der Zeit spart, ist die manuelle Analyse nur einen kleinen Schritt von den Originaldaten entfernt (die weniger sauber sind)
am

Ich denke, die beste Option ist ein Cache wie Redis, der in Verbindung mit msgpack verwendet werden kann. Zumindest können Sie anstelle der Festplatte im Speicher bleiben.
Emre

1
Ich würde in Betracht ziehen, Feather zu verwenden - es ist sehr schnell
MaxU

1
Wäre Spark und sein Caching eine Option? Sie würden sich im Wesentlichen darauf beschränken, Spark in Ihren Notizbüchern zu verwenden, um Ihr erstes Lesen / Verarbeiten
durchzuführen

Antworten:


4

Wenn es für Ihre Anwendungsfälle wichtig ist, können Sie versuchen, zu Apache Zeppelin zu wechseln. Da alle Spark-Notebooks dort denselben Spark-Kontext und dieselbe Python-Laufumgebung verwenden. https://zeppelin.apache.org/

Was Sie also fragen, geschieht nativ in Zeppelin. Um vollständig zu sein, können Sie alle Spark-Notebooks denselben Spark-Kontext / dieselbe Python-Umgebung verwenden (sie werden im Zeppelin als "Notizen" bezeichnet):

Spark Interpreter Sharing-Optionen in Zeppelin

Sie können also wählen, ob Sie den Kontext global (Standardverhalten von Zeppelin), pro Notiz (das einzig mögliche Verhalten von Jupyter) oder pro Benutzer freigeben möchten.

Wenn Sie nicht zu Zeppelin wechseln können / möchten, sehen Sie sich andere Optionen für die gemeinsame Nutzung gemeinsamer Datenrahmen zwischen Ihren Notebooks an:

ps. Sie können derzeit keine ipynb-Dateien in Zeppelin importieren (das eigene Notebook-Format ist als JSON-Datei gespeichert), bis https://issues.apache.org/jira/browse/ZEPPELIN-1793 implementiert ist. obwohl es in den meisten Fällen nicht so schwer ist, sie manuell zu konvertieren.


1
Danke. Ich werde wahrscheinlich von ipython / jupyter Notebooks weg wechseln. Unterstützt Zeppelin die Möglichkeit, selektiv nur den Inhalt definierter Variablen zu teilen, jedoch keine identisch benannte Variable in verschiedenen Editoren / Notizbüchern / Notizen? (wie MATLAB)
tsttst

Leider - nein, es wird auf Prozessebene gesteuert. Also ist es entweder alles oder nichts. Wenn Sie Per Note wählen, ist dies das gleiche Verhalten wie in Jupyter. Wenn Sie Global wählen, teilen sie alles. Wir verwenden Global normalerweise, da es weniger ressourcenintensiv ist, insbesondere in Umgebungen mit mehreren Benutzern. Ich habe Matlab eine Weile nicht mehr verwendet, aber wenn Sie nur für ausgewählte Variablen freigeben müssen, können Sie sich Apache Arrow oder Feather ansehen, wenn es sich um Jupyter oder Zeppelin handelt.
Tagar
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.