Evite recargar DataFrame entre diferentes núcleos de Python

10

¿Hay alguna manera de mantener una variable (cuadro grande / marco de datos) en la memoria y compartirla en múltiples computadoras portátiles ipython?

Estaría buscando algo, que es conceptualmente similar a las variables persistentes de MATLAB. Allí es posible llamar a una función / biblioteca personalizada desde múltiples editores individuales (cuadernos), y hacer que esa función externa guarde algún resultado (o tabla grande).

Principalmente, me gustaría evitar volver a cargar una tabla muy utilizada (que se carga a través de una biblioteca personalizada que se llama desde los cuadernos), ya que leerla toma alrededor de 2-3 minutos cada vez que comienzo un nuevo análisis.

tsttst
fuente
1
Esto no parece ser posible, y podría causar muchos dolores de cabeza si no tienes cuidado. ¿Persistir los datos en un formato eficiente como msgpack no es una opción?
Emre
@ Emre Gracias. Una parte difícil con msgpack es que no resuelve el problema subyacente de la necesidad de leer la tabla. También es una espada de doble filo: si bien ahorra alrededor del 40% del tiempo en comparación con el formato original de la tabla, también coloca el análisis manual a un pequeño paso de los datos originales (que es menos limpio)
tsttst
Creo que la mejor opción es un caché como redis, que se puede usar junto con msgpack. Al menos puede conservar la memoria en lugar del disco.
Emre
1
Consideraría usar Feather , es muy rápido
MaxU
1
¿Spark y su almacenamiento en caché serían una opción? Esencialmente, estaría limitado a usar Spark en sus cuadernos para hacer su lectura / procesamiento inicial
Dolan Antenucci

Respuestas:

4

Si es importante para sus casos de uso, puede intentar cambiar a Apache Zeppelin. Como todos los portátiles de Spark comparten el mismo contexto de Spark, el mismo entorno de ejecución de Python. https://zeppelin.apache.org/

Entonces, lo que estás pidiendo sucede de forma nativa en Zeppelin. O para completar, es una opción para compartir el mismo contexto de Spark / el mismo entorno de Python entre todos los cuadernos de Spark (se llaman 'notas' en Zeppelin):

Opciones para compartir el intérprete de chispas en Zeppelin

Por lo tanto, puede elegir compartir contexto globalmente (comportamiento predeterminado de Zeppelin), por nota (el único comportamiento posible de Jupyter) o por usuario.

Si no puede / no desea cambiar a Zeppelin, busque otras opciones para compartir marcos de datos comunes entre sus computadoras portátiles usando:

PD. No puede importar archivos ipynb a Zeppelin actualmente (tiene su propio formato de cuaderno almacenado como un archivo json), hasta que se implemente https://issues.apache.org/jira/browse/ZEPPELIN-1793 ; aunque no es tan difícil convertirlos manualmente en la mayoría de los casos.

Tagar
fuente
1
Gracias. Probablemente cambiaré de las notebooks ipython / jupyter. ¿Zeppelin admite la posibilidad de compartir selectivamente solo el contenido de variables definidas, pero no de ninguna variable con un nombre idéntico dentro de diferentes editores / cuadernos / notas? (como lo hace MATLAB)
tsttst
Desafortunadamente, no, se controla a nivel de proceso. Entonces es todo o nada. Si elige Por nota, será el mismo comportamiento que en Jupyter. Si elige Globalmente, compartirán todo. Normalmente utilizamos Globally, ya que requiere menos recursos, especialmente en entornos multiusuario. No he usado Matlab por un tiempo, pero si tiene que compartir solo las variables elegidas, podría echar un vistazo a Apache Arrow o Feather, si es Jupyter o Zeppelin.
Tagar