2015-07-06 10 views
9

Ambiente:Come memorizzare nella cache in Notebook IPython?

  • Python 3
  • IPython 3,2

Ogni volta che chiudo un quaderno IPython e riaprirlo, devo ri-eseguire tutte le cellule. Ma alcune cellule implicano un calcolo intensivo.

Al contrario, knitr in R salva i risultati in una directory cache per impostazione predefinita in modo che solo il nuovo codice e le nuove impostazioni richiamino il calcolo.

Ho guardato a ipycache ma sembra memorizzare nella cache una cella invece del notebook. Esiste una controparte della cache di knitr in IPython?

+1

Non so se v'è tale capacità in ipython, ma si può semplicemente memorizzare nella cache i tuoi calcoli costosi a disco con per esempio [joblib.Memory] (https://pythonhosted.org/joblib/memory.html). – rth

risposta

0

Puoi fare un esempio di cosa stai cercando di fare? Quando eseguo qualcosa in un notebook IPython che è costoso, lo scrivo quasi sempre su disco dopo la parola. Ad esempio, se il mio dati è un elenco di oggetti JSON, scrivo su disco come linea di separazione JSON stringhe formattate:

with open('path_to_file.json', 'a') as file: 
    for item in data: 
     line = json.dumps(item) 
     file.write(line + '\n') 

È quindi possibile leggere di nuovo i dati nello stesso modo:

data = [] 
with open('path_to_file.json', 'a') as file: 
    for line in file: 
     data_item = json.loads(line) 
     data.append(data_item) 

Penso che questa sia una buona pratica in generale perché ti fornisce un backup. Puoi anche usare pickle per la stessa cosa. Se i tuoi dati sono davvero grandi, puoi effettivamente scrivere gzip.open in un file zip.

EDIT

Per salvare uno scikit imparare modello per l'utilizzo del disco joblib.pickle.

from sklearn.cluster import KMeans 

km = KMeans(n_clusters=num_clusters) 
km.fit(some_data) 


from sklearn.externals import joblib 
# dump to pickle 
joblib.dump(km, 'model.pkl') 

# and reload from pickle 
km = joblib.load('model.pkl') 
+0

Ho provato ad applicare modelli di apprendimento automatico ai set di dati. Ad esempio, importare alcuni dati (alcune centinaia di MB) da panda e quindi addestrare e testare due modelli di scikit-learn. Voglio "memorizzare" tutti i DataFrame trasformati intermedi, così come i modelli addestrati. Quindi posso "portare avanti" esperimenti sul DataFrame intermedio senza leggere da terra. – Zelong

+0

@zelong ok, dovresti usare 'joblib' per mettere sott'occhio i tuoi modelli' sklearn'. Vedi la mia modifica sopra. E per scrivere i tuoi dataframes su disco basta usare 'dataframe.to_csv ('yourfile.csv)' – brandomr

+0

Grazie mille. La decapitazione del modello di apprendimento scikit sembra abbastanza buona. Ho provato un bel po 'di discussioni con DataFrames e sembra impegnativo salvare un po' di DataFrame intermedio in file CSV. Ma sembra che IPython non abbia fornito una controparte della cache 'RData', che ha messo tutto in un unico cubo. – Zelong

1

Sfortunatamente, non sembra che ci sia qualcosa di comodo come una cache automatica. L'opzione magica %store è chiusa, ma richiede di eseguire la cache e il ricaricamento manualmente ed esplicitamente.

Nel tuo quaderno Jupyter:

a = 1 
%store a 

Ora, diciamo che si chiude il notebook e il kernel viene riavviato. Non hai più accesso alle variabili locali. Tuttavia, è possibile possibile ricaricare le variabili memorizzate utilizzando l'opzione -r.

%store -r a 
print a # Should print 1 
0

In realtà la funzionalità si chiede è già lì, non c'è bisogno di re-implementare manualmente facendo le vostre discariche.

È possibile utilizzare l'uso del negozio% o forse meglio la magia di cache %% (estensione) per memorizzare i risultati di queste cellule ad intermittenza, in modo da non dover essere ricalcolato (vedi https://github.com/rossant/ipycache)

E ' è semplice come:

Quindi, in una cella ad es.:

%%cache mycache.pkl var1 var2 
var1 = 1 
var2 = 2 

Quando si esegue questa cella la prima volta, il codice viene eseguito, e le variabili var1 e var2 vengono salvati in mycache.pkl nella directory corrente insieme con le uscite. Gli output display ricchi vengono salvati solo se si utilizza la versione di sviluppo di IPython. Quando si esegue di nuovo questa cella , il codice viene saltato, le variabili vengono caricate dal file e immesse nello spazio dei nomi e le uscite vengono ripristinate nel notebook .