Hindari memuat ulang DataFrame antara kernel python yang berbeda

10

Apakah ada cara untuk menjaga variabel (tabel besar / bingkai data) dalam memori dan membaginya di beberapa notebook ipython?

Saya akan mencari sesuatu, yang secara konseptual mirip dengan variabel gigih MATLAB. Ada kemungkinan untuk memanggil fungsi kustom / pustaka dari beberapa editor individu (notebook), dan memiliki fungsi eksternal yang menyimpan beberapa hasil (atau tabel besar).

Sebagian besar saya ingin menghindari memuat ulang tabel yang banyak digunakan (yang dimuat melalui perpustakaan khusus yang disebut dari notebook), karena membaca dibutuhkan sekitar 2-3 menit setiap kali saya memulai analisis baru.

pertama
sumber
1
Ini tampaknya tidak mungkin, dan itu bisa menyebabkan banyak sakit kepala jika Anda tidak hati-hati. Apakah mempertahankan data ke format yang efisien seperti msgpack bukan opsi?
Emre
@ Terima kasih. Bagian yang sulit dengan msgpack adalah ia tidak menyelesaikan masalah mendasar dari kebutuhan untuk membaca tabel. Juga merupakan pedang bermata dua: Meskipun menghemat sekitar 40% dari waktu dibandingkan dengan format asli dari tabel, itu juga menempatkan analisis manual satu langkah kecil dari data asli (yang kurang bersih)
tsttst
Saya pikir opsi terbaik adalah cache seperti redis, yang dapat digunakan bersamaan dengan msgpack. Setidaknya Anda bisa bertahan ke memori, bukan disk.
Emre
1
Saya akan mempertimbangkan menggunakan Feather - ini sangat cepat
MaxU
1
Akankah Spark dan caching menjadi pilihan? Anda pada dasarnya dibatasi untuk menggunakan Spark di notebook Anda meskipun untuk melakukan pembacaan awal Anda / pemrosesan
Dolan Antenucci

Jawaban:

4

Jika ini penting untuk kasus penggunaan Anda, Anda bisa mencoba beralih ke Apache Zeppelin. Karena semua buku catatan Spark ada berbagi konteks Spark yang sama, lingkungan menjalankan Python yang sama. https://zeppelin.apache.org/

Jadi apa yang Anda minta terjadi secara asli di Zeppelin. Atau lebih lengkapnya, ini adalah opsi untuk berbagi konteks Spark yang sama / lingkungan Python yang sama di antara semua notebook Spark (mereka disebut 'catatan' di Zeppelin):

Opsi Berbagi Juru Bahasa Spark di Zeppelin

Jadi Anda dapat memilih untuk berbagi konteks secara global (perilaku Zeppelin default), Per Note (satu-satunya perilaku Jupyter yang mungkin), atau Per Pengguna.

Jika Anda tidak bisa / tidak ingin beralih ke Zeppelin, lihat opsi lain untuk berbagi kerangka data umum antara notebook Anda menggunakan:

ps. Anda tidak dapat mengimpor file ipynb ke Zeppelin saat ini (sekarang memiliki format notebook sendiri yang disimpan sebagai file json), hingga https://issues.apache.org/jira/browse/ZEPPELIN-1793 diimplementasikan; meskipun tidak sulit untuk mengubahnya secara manual dalam banyak kasus.

Tagar
sumber
1
Terima kasih. Saya mungkin akan beralih dari notebook ipython / jupyter. Apakah zeppelin mendukung kemungkinan untuk secara selektif hanya berbagi konten dari variabel yang ditentukan, tetapi tidak dengan variabel yang bernama identik dalam editor / notebook / catatan yang berbeda? (seperti halnya MATLAB)
tsttst
Sayangnya - tidak, itu dikendalikan pada tingkat proses. Jadi itu semua atau tidak sama sekali. Jika Anda memilih Per Note, itu akan menjadi perilaku yang sama seperti di Jupyter. Jika Anda memilih Secara global, mereka akan membagikan segalanya. Kami biasanya menggunakan global karena kurang intensif sumber daya terutama di lingkungan multi-pengguna. Tidak pernah menggunakan Matlab untuk sementara waktu, tetapi jika Anda harus melakukan sharing hanya untuk variabel yang dipilih - Anda bisa melihat Apache Arrow atau Feather, apakah itu Jupyter atau Zeppelin.
Tagar