Evite recarregar o DataFrame entre diferentes kernels python

10

Existe uma maneira de manter uma variável (tabela grande / quadro de dados) na memória e compartilhá-la entre vários notebooks ipython?

Eu estaria procurando por algo que seja conceitualmente semelhante às variáveis ​​persistentes do MATLAB. É possível chamar uma função / biblioteca personalizada de vários editores individuais (notebooks) e fazer com que essa função externa armazene em cache algum resultado (ou tabela grande).

Principalmente, gostaria de evitar recarregar uma tabela muito usada (carregada através de uma biblioteca personalizada chamada dos blocos de anotações), pois a leitura demora cerca de 2 a 3 minutos sempre que inicio uma nova análise.

tsttst
fonte
11
Isso não parece ser possível e pode causar muitas dores de cabeça se você não tomar cuidado. A persistência dos dados em um formato eficiente como o msgpack não é uma opção?
Emre
@ Emre Obrigado. Uma parte complicada do msgpack é que ele não resolve o problema subjacente da necessidade de ler a tabela. Também é uma faca de dois gumes: embora economize cerca de 40% do tempo em comparação com o formato original da tabela, também coloca a análise manual a um pequeno passo dos dados originais (o que é menos limpo)
tsttst
Eu acho que a melhor opção é um cache como o redis, que pode ser usado em conjunto com o msgpack. Pelo menos você pode persistir na memória em vez do disco.
Emre
11
Eu consideraria o uso do Feather - é muito rápido
#
11
O Spark e seu cache seriam uma opção? Você estaria basicamente limitado a usar o Spark em seus blocos de anotações, apesar de fazer sua leitura / processamento inicial
Dolan Antenucci

Respostas:

4

Se for importante para seus casos de uso, você pode tentar mudar para o Apache Zeppelin. Como todos os notebooks Spark compartilham o mesmo contexto Spark, o mesmo ambiente de execução Python. https://zeppelin.apache.org/

Então, o que você está pedindo acontece nativamente no Zeppelin. Ou, para ser completo, é uma opção para compartilhar o mesmo contexto Spark / mesmo ambiente Python entre todos os notebooks Spark (eles são chamados de 'notas' no Zeppelin):

Opções de compartilhamento de intérpretes Spark no Zeppelin

Portanto, você pode optar por compartilhar o contexto Globalmente (comportamento padrão do Zeppelin), Por nota (o único comportamento possível do Jupyter) ou Por usuário.

Se você não pode / não deseja mudar para o Zeppelin, consulte outras opções de compartilhamento de quadros de dados comuns entre seus notebooks usando:

ps. Atualmente, você não pode importar arquivos ipynb para o Zeppelin (ele possui seu próprio formato de notebook armazenado como um arquivo json), até que https://issues.apache.org/jira/browse/ZEPPELIN-1793 seja implementado; embora não seja tão difícil convertê-los manualmente na maioria dos casos.

Tagar
fonte
11
Obrigado. Provavelmente vou me afastar dos notebooks ipython / jupyter. O zeppelin suporta a possibilidade de compartilhar seletivamente apenas o conteúdo de variáveis ​​definidas, mas não de qualquer variável nomeada de maneira idêntica dentro de diferentes editores / cadernos / anotações? (como MATLAB faz)
tsttst
Infelizmente - não, é controlado no nível do processo. Então é tudo ou nada. Se você escolher Por nota, será o mesmo comportamento do Jupyter. Se você escolher Globalmente, eles compartilharão tudo. Normalmente, usamos Globalmente, pois consome menos recursos, especialmente em ambientes multiusuários. Não usa o Matlab há algum tempo, mas se você precisar compartilhar apenas as variáveis ​​escolhidas - poderá dar uma olhada no Apache Arrow ou Feather, se for Jupyter ou Zeppelin.
Tagar