Избегайте перезагрузки DataFrame между разными ядрами Python

10

Есть ли способ сохранить переменную (большой стол / фрейм данных) в памяти и разделить ее между несколькими ноутбуками ipython?

Я бы искал что-то, что концептуально похоже на постоянные переменные MATLAB. Там можно вызывать пользовательскую функцию / библиотеку из нескольких отдельных редакторов (записных книжек), и эта внешняя функция кэширует некоторый результат (или большую таблицу).

В основном я хотел бы избежать перезагрузки интенсивно используемой таблицы (которая загружается через пользовательскую библиотеку, которая вызывается из записных книжек), поскольку чтение занимает около 2-3 минут всякий раз, когда я начинаю новый анализ.

tsttst
источник
1
Это не представляется возможным, и это может вызвать много головных болей, если вы не будете осторожны. Сохранение данных в эффективном формате, таком как msgpack, не вариант?
Эмре
@ Emre Спасибо. Сложность использования msgpack заключается в том, что он не решает основную проблему необходимости чтения таблицы. Также это обоюдоострый меч: хотя он экономит около 40% времени по сравнению с исходным форматом таблицы, он также помещает ручной анализ на один маленький шаг от исходных данных (который менее чист)
tsttst
Я думаю, что лучший вариант - это кеш вроде redis, который можно использовать вместе с msgpack. По крайней мере, вы можете сохранить память вместо диска.
Эмре
1
Я хотел бы рассмотреть использование Feather - это очень быстро
MaxU
1
Будет ли Spark и его кеширование быть вариантом? По сути, вы будете ограничены использованием Spark в своих записных книжках для первоначального чтения / обработки
Dolan

Ответы:

4

Если это важно для ваших случаев использования, вы можете попробовать перейти на Apache Zeppelin. Как и все ноутбуки Spark, они имеют один и тот же контекст Spark и ту же среду исполнения Python. https://zeppelin.apache.org/

То, что вы спрашиваете, происходит в Цеппелине. Или, чтобы быть полным, это вариант для совместного использования одного и того же контекста Spark / одного и того же окружения Python между всеми ноутбуками Spark (в Zeppelin они называются «заметками»):

Параметры общего доступа Spark Interpreter в Zeppelin

Таким образом, вы можете выбрать общий доступ к контексту (поведение Zeppelin по умолчанию), Per Note (единственно возможное поведение Jupyter) или Per User.

Если вы не можете / не хотите переключаться на Zeppelin, посмотрите другие варианты совместного использования общих кадров данных между вашими ноутбуками, используя:

пс. Вы не можете импортировать файлы ipynb в Zeppelin в настоящее время (у него есть собственный формат записной книжки, сохраненный как файл json), пока не будет реализован https://issues.apache.org/jira/browse/ZEPPELIN-1793 ; хотя в большинстве случаев преобразовать их вручную не так сложно.

Tagar
источник
1
Спасибо. Я, вероятно, переключусь с ноутбуков ipython / jupyter. Поддерживает ли zeppelin возможность выборочного обмена только содержимым определенных переменных, но не любой переменной с одинаковым именем в разных редакторах / записных книжках / заметках? (как делает MATLAB)
tsttst
К сожалению, нет, это контролируется на уровне процесса. Так что или все или ничего. Если вы выберете Per Note, поведение будет таким же, как в Jupyter. Если вы выберете глобально, они будут делиться всем. Обычно мы используем глобально, так как он менее ресурсоемкий, особенно в многопользовательской среде. Некоторое время не использовал Matlab, но если вам нужно делиться только для выбранных переменных - вы можете взглянуть на Apache Arrow или Feather, если это Jupyter или Zeppelin.
Тагар