Évitez de recharger DataFrame entre différents noyaux python

10

Existe-t-il un moyen de conserver une variable (grande table / bloc de données) en mémoire et de la partager entre plusieurs blocs-notes ipython?

Je chercherais quelque chose, qui est conceptuellement similaire aux variables persistantes de MATLAB. Là, il est possible d'appeler une fonction / bibliothèque personnalisée à partir de plusieurs éditeurs individuels (cahiers), et de faire en sorte que cette fonction externe cache un résultat (ou un grand tableau).

La plupart du temps, je voudrais éviter de recharger une table très utilisée (qui est chargée via une bibliothèque personnalisée appelée à partir des carnets), car la lecture prend environ 2-3 minutes chaque fois que je commence une nouvelle analyse.

tsttst
la source
1
Cela ne semble pas possible, et cela pourrait causer beaucoup de maux de tête si vous ne faites pas attention. La persistance des données dans un format efficace comme msgpack n'est- elle pas une option?
Emre
@Emre Merci. Une partie délicate avec msgpack est qu'elle ne résout pas le problème sous-jacent d'avoir besoin de lire la table. C'est également une épée à double tranchant: bien qu'elle économise environ 40% du temps par rapport au format d'origine de la table, elle place également l'analyse manuelle à un petit pas des données d'origine (ce qui est moins propre)
tsttst
Je pense que la meilleure option est un cache comme redis, qui peut être utilisé en conjonction avec msgpack. Au moins, vous pouvez persister dans la mémoire au lieu du disque.
Emre
1
J'envisagerais d'
1
Est-ce que Spark et sa mise en cache seraient une option? Vous seriez essentiellement limité à utiliser Spark dans vos cahiers, mais pour faire votre lecture / traitement initial
Dolan Antenucci

Réponses:

4

Si c'est important pour vos cas d'utilisation, vous pouvez essayer de passer à Apache Zeppelin. Comme tous les blocs-notes Spark, ils partagent le même contexte Spark, le même environnement d'exécution Python. https://zeppelin.apache.org/

Donc, ce que vous demandez se produit nativement dans Zeppelin. Ou pour être complet, c'est une option pour partager le même contexte Spark / même environnement Python entre tous les blocs-notes Spark (ils sont appelés «notes» dans Zeppelin):

Options de partage d'interprète Spark dans Zeppelin

Vous pouvez donc choisir de partager le contexte globalement (comportement par défaut de Zeppelin), par note (le seul comportement possible de Jupyter) ou par utilisateur.

Si vous ne pouvez pas / ne voulez pas passer à Zeppelin, regardez d'autres options de partage de trames de données communes entre vos ordinateurs portables en utilisant:

ps. Vous ne pouvez pas importer de fichiers ipynb vers Zeppelin actuellement (il a son propre format de bloc-notes stocké en tant que fichier json), jusqu'à ce que https://issues.apache.org/jira/browse/ZEPPELIN-1793 soit implémenté; bien qu'il ne soit pas si difficile de les convertir manuellement dans la plupart des cas.

Tagar
la source
1
Je vous remercie. Je vais probablement quitter les blocs-notes ipython / jupyter. Est-ce que zeppelin prend en charge la possibilité de partager sélectivement uniquement le contenu des variables définies, mais pas d'une variable nommée de manière identique dans différents éditeurs / cahiers / notes? (comme MATLAB)
tsttst
Malheureusement - non, c'est contrôlé au niveau du processus. C'est donc tout ou rien. Si vous choisissez Par note, ce sera le même comportement que dans Jupyter. Si vous choisissez Globalement, ils partageront tout. Nous utilisons normalement Globally car il consomme moins de ressources, en particulier dans un environnement multi-utilisateurs. Je n'ai pas utilisé Matlab depuis un certain temps, mais si vous ne devez partager que pour les variables choisies - vous pouvez jeter un œil à Apache Arrow ou Feather, s'il s'agit de Jupyter ou Zeppelin.
Tagar