Evita di ricaricare DataFrame tra diversi kernel Python


10

Esiste un modo per mantenere una variabile (tabella di grandi dimensioni / frame di dati) in memoria e condividerla su più notebook ipython?

Cercherei qualcosa, concettualmente simile alle variabili persistenti di MATLAB. Lì è possibile chiamare una funzione / libreria personalizzata da più singoli editor (notebook), e avere quella funzione esterna che memorizza nella cache alcuni risultati (o tabella di grandi dimensioni).

Principalmente vorrei evitare di ricaricare una tabella molto usata (che viene caricata attraverso una libreria personalizzata che viene chiamata dai notebook), poiché la lettura richiede circa 2-3 minuti ogni volta che inizio una nuova analisi.


1
Questo non sembra essere possibile e potrebbe causare molti mal di testa se non stai attento. Persistere i dati in un formato efficiente come msgpack non è un'opzione?
Emre,

@Emre Grazie. Una parte complicata di msgpack è che non risolve il problema alla base della necessità di leggere la tabella. Inoltre è un'arma a doppio taglio: mentre risparmia circa il 40% delle volte rispetto al formato originale della tabella, mette anche l'analisi manuale a un passo dai dati originali (che è meno pulito)
tsttst

Penso che l'opzione migliore sia una cache come redis, che può essere utilizzata insieme a msgpack. Almeno puoi persistere nella memoria invece che sul disco.
Emre,

1
Vorrei prendere in considerazione l'uso di Feather - è molto veloce
MaxU

1
Spark e la sua memorizzazione nella cache sarebbero un'opzione? In sostanza, ti limiteresti a usare Spark nei tuoi quaderni per fare la lettura / elaborazione iniziale
Dolan Antenucci,

Risposte:


4

Se è importante per i tuoi casi d'uso, puoi provare a passare ad Apache Zeppelin. Come tutti i notebook Spark, condividono lo stesso contesto Spark, lo stesso ambiente di esecuzione Python. https://zeppelin.apache.org/

Quindi quello che stai chiedendo accade nativamente in Zeppelin. O per essere completo, è un'opzione per condividere lo stesso contesto Spark / lo stesso potenziamento Python tra tutti i notebook Spark (sono chiamati 'note' in Zeppelin):

Opzioni di condivisione dell'interprete Spark in Zeppelin

Quindi puoi scegliere di condividere il contesto a livello globale (comportamento predefinito di Zeppelin), Per nota (l'unico comportamento possibile di Jupyter) o Per utente.

Se non puoi / non vuoi passare a Zeppelin, guarda altre opzioni di condivisione di frame di dati comuni tra i tuoi notebook usando:

ps. Al momento non è possibile importare i file ipynb su Zeppelin (ha il proprio formato di notebook archiviato come file json), fino a quando non verrà implementato https://issues.apache.org/jira/browse/ZEPPELIN-1793 ; sebbene non sia così difficile convertirli manualmente nella maggior parte dei casi.


1
Grazie. Probabilmente mi allontanerò dai notebook ipython / jupyter. Zeppelin supporta la possibilità di condividere selettivamente solo il contenuto di variabili definite, ma non di qualsiasi variabile identicamente denominata all'interno di diversi editor / notebook / note? (come MATLAB)
tsttst

Sfortunatamente, no, è controllato a livello di processo. Quindi è tutto o niente. Se scegli Per nota, sarà lo stesso comportamento di Jupyter. Se scegli Globalmente, condivideranno tutto. Normalmente utilizziamo globalmente in quanto richiede meno risorse, soprattutto in ambiente multiutente. Non ho usato Matlab per un po ', ma se devi fare la condivisione solo per le variabili scelte - potresti dare un'occhiata ad Apache Arrow o Feather, se è Jupyter o Zeppelin.
Tagar,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.