Unikaj przeładowywania DataFrame między różnymi jądrami Pythona


10

Czy istnieje sposób na zachowanie zmiennej (dużej tabeli / ramki danych) w pamięci i współdzielenie jej przez wiele notebooków ipython?

Szukałbym czegoś, co jest koncepcyjnie podobne do trwałych zmiennych MATLAB. Istnieje możliwość wywołania niestandardowej funkcji / biblioteki z wielu indywidualnych edytorów (notebooków) i uzyskania przez tę funkcję pamięci podręcznej jakiegoś wyniku (lub dużej tabeli).

Przede wszystkim chciałbym uniknąć ponownego ładowania mocno używanej tabeli (która jest ładowana przez niestandardową bibliotekę, która jest wywoływana z notesów), ponieważ czytanie zajmuje około 2-3 minut za każdym razem, gdy zaczynam nową analizę.


1
Nie wydaje się to możliwe i może być przyczyną wielu bólów głowy, jeśli nie będziesz ostrożny. Czy utrwalanie danych do wydajnego formatu, takiego jak msgpack, nie jest opcją?
Emre

@ Emre Dziękuję. Trudna część z msgpack polega na tym, że nie rozwiązuje on podstawowego problemu konieczności czytania tabeli. Jest to także obosieczny miecz: pozwala zaoszczędzić około 40% czasu w porównaniu z oryginalnym formatem tabeli, ale stawia także analizę ręczną o krok od oryginalnych danych (co jest mniej czyste)
tsttst

Myślę, że najlepszą opcją jest pamięć podręczna taka jak redis, której można używać w połączeniu z msgpack. Przynajmniej możesz pozostać w pamięci zamiast na dysku.
Emre

1
Rozważałbym użycie Feather - jest bardzo szybki
MaxU

1
Czy Spark i jego buforowanie byłyby opcją? Zasadniczo ograniczyłbyś się do używania Spark'a w swoich notatnikach do początkowego czytania / przetwarzania
Dolan Antenucci

Odpowiedzi:


4

Jeśli jest to ważne dla twoich przypadków użycia, możesz spróbować przejść na Apache Zeppelin. Ponieważ wszystkie zeszyty Spark mają ten sam kontekst Spark, to samo środowisko uruchomione w języku Python. https://zeppelin.apache.org/

Więc to, o co pytasz, dzieje się natywnie w Zeppelin. Lub, aby zakończyć, jest to opcja, aby współużytkować ten sam kontekst Spark / to samo środowisko Python między wszystkimi notatnikami Spark (w Zeppelin nazywane są one „notatkami”):

Spark Udostępnianie interpretera w Zeppelin

Możesz więc wybrać kontekst globalny (domyślne zachowanie Zeppelina), na notatkę (jedyne możliwe zachowanie Jupytera) lub na użytkownika.

Jeśli nie możesz / nie chcesz przejść na Zeppelin, spójrz na inne opcje udostępniania wspólnych ramek danych między notebookami za pomocą:

ps. Obecnie nie można importować plików ipynb do Zeppelin (ma swój własny format notebooka zapisany jako plik json), dopóki nie zostanie zaimplementowany https://issues.apache.org/jira/browse/ZEPPELIN-1793 ; chociaż w większości przypadków nie jest tak trudno przekonwertować je ręcznie.


1
Dziękuję Ci. Prawdopodobnie przerzucę się z notebooków ipython / jupyter. Czy zeppelin obsługuje możliwość selektywnego udostępniania tylko treści zdefiniowanych zmiennych, ale nie żadnej zmiennej o takiej samej nazwie w różnych edytorach / notatnikach / notatkach? (jak robi to MATLAB)
2017

Niestety - nie, jest kontrolowany na poziomie procesu. Więc to wszystko albo nic. Jeśli wybierzesz opcję Na notatkę, będzie to samo zachowanie, co w Jupyter. Jeśli wybierzesz Globalnie, udostępnią wszystko. Zwykle używamy globalnie, ponieważ wymaga mniej zasobów, szczególnie w środowisku wielu użytkowników. Od jakiegoś czasu nie używałem Matlaba, ale jeśli musisz udostępniać tylko wybrane zmienne - możesz spojrzeć na Strzałkę Apache lub Pióro, jeśli jest to Jupyter lub Zeppelin.
Tagar
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.