1 of 29

Como compartir grandes Datasets entre procesos

sin perder la salud mental

Juan Francisco Huete Verdejo

2 of 29

Planteamiento del Problema

Step 1

df_A

Step 2

df_A

df_B

Step 3

df_C

df_D

Step 4

df_A

df_B

df_E

df_F

df_A

PIPELINE

3 s

15 s

12 s

20 s

3 of 29

Planteamiento del Problema

Step 1

df_A

Step 2

df_A

df_B

Step 3

df_C

df_D

Step 4

df_A

df_B

df_E

df_F

df_A

PIPELINE

3 s

15 s

12 s

20 s

4 of 29

Planteamiento del Problema

Step 1

df_A

Step 2

df_A

df_B

Step 3

df_C

df_D

Step 4

df_A

df_B

df_E

df_F

df_A

PIPELINE

3 s

15 s

12 s

20 s

15 s

5 of 29

Planteamiento del Problema

Step 1

df_A

Step 2

df_A

df_B

Step 3

df_C

df_D

Step 4

df_A

df_B

df_E

df_F

df_A

PIPELINE

3 s

15 s

12 s

20 s

15 s

6 of 29

Planteamiento del Problema

Celery worker

Step 1

df_A

Celery worker

Step 2

df_A

df_B

Celery worker

Celery worker

Step 3

df_C

df_D

Step 4

df_A

df_B

df_E

df_F

df_A

PIPELINE

3 s

15 s

12 s

20 s

7 of 29

Comienzan los errores

Celery worker

Step 1

df_A

Celery worker

Step 2

df_A

df_B

Celery worker

Celery worker

Step 3

df_C

df_D

Step 4

df_A

df_B

df_E

df_F

df_A

PIPELINE

3 s

15 s

12 s

20 s

Error

25 s

Usamos pickle y pasamos los df por

argumento a los workers

8 of 29

Comienzan los errores

Celery worker

Step 1

df_A

Celery worker

Step 2

df_A

df_B

Celery worker

Celery worker

Step 3

df_C

df_D

Step 4

df_A

df_B

df_E

df_F

df_A

PIPELINE

3 s

15 s

12 s

20 s

Error

25 s

Usamos pickle y pasamos los df por

argumento a los workers

9 of 29

Comienzan los errores

Celery worker

Step 1

df_A

Celery worker

Step 2

df_A

df_B

Celery worker

Celery worker

Step 3

df_C

df_D

Step 4

df_A

df_B

df_E

df_F

df_A

PIPELINE

3 s

15 s

12 s

20 s

50s

60 s

Guardamos los df en disco y leemos en los workers

10 of 29

Comienzan los errores

11 of 29

Algunas Alternativas

/ Redis

/ PyArrow + Plasma

/ Vaex

/ Vaex +S3

12 of 29

Redis

/ Base de datos en memoria

/ Clave valor

Inconvenientes

/ Limitación del tamaño de los valores a 500MB

/ Serialización usando pickle es lenta respecto a otras serializaciones

/ Muy fácil de configurar

/ Muy versátil

/ Para pequeñas ETL con df pequeños (< 500MB) es una solución rápida y simple

Ventajas

13 of 29

Redis

Celery worker

Step 1

df_A

Celery worker

Step 2

df_A

df_B

Celery worker

Step 3

df_C

df_D

df_E

df_F

df_A

key_A

key_B

Redis

key_A: <df_A>

key_A: <df_A>

key_A

14 of 29

Redis

Transferencia

Lectura

Benchmark

  • xs (~100MB): 1.384s
  • s (~550MB): Error

15 of 29

Pyarrow + Plasma

/ Arrow es un formato de datos en memoria en columnas

/ Facilita la conversión de los datos entre diferentes lenguajes

/ Plasma es un almacén de objetos arrow en memoria

Inconvenientes

/ Necesita un filesystem

/ Solo compatible con linux y MacOS

/ Serialización muy rápida

/ Transmisión muy rápida

/ Compatibilidad con df de muchos lenguajes

Ventajas

16 of 29

Pyarrow + Plasma

Instalación de Plasma

Plasma viene de serie en el paquete de pyarrow.

$ pip install pyarrow

Demonio de Plasma

$ plasma_store -m 8000000000 -s /tmp/plasma

-m Número de bytes reservados en memoria

-s Path del socket

17 of 29

Pyarrow + Plasma

Celery worker

Step 1

df_A

Celery worker

Step 2

df_A

df_B

Celery worker

Step 3

df_C

df_D

df_E

df_F

df_A

ObjectId_A

ObjectId_B

PLASMA

ObjectId_A: <df_A>

ObjectId_A: <df_A>

ObjectId_A

18 of 29

Pyarrow + Plasma

Transferencia

Lectura

Benchmark

  • xs (~100MB): 0.914s
  • s (~550MB): 1.456
  • m (~1GB): 2.203s
  • l (~3GB): 5.546s

19 of 29

Pyarrow + Plasma

Transferencia

20 of 29

Pyarrow + Plasma

Transferencia

Lectura

Benchmark

  • xs (~100MB): 0.914s
  • s (~550MB): 1.456s
  • m (~1GB): 2.203s
  • l (~3GB): 5.546s
  • xl (~4GB): 10.267s

21 of 29

Pyarrow + Plasma

Transferencia

Lectura

Benchmark

  • xs (~100MB): 0.914s
  • s (~550MB): 1.456s
  • m (~1GB): 2.203s
  • l (~3GB): 5.546s
  • xl (~4GB): 10.267s

MIS

DIESES

22 of 29

Vaex

/ Mapeo de datos en memoria

/ Lectura ultra rápida

/ Alternativa a pandas

/ Cacheo

Inconvenientes

/ Api similar a pandas

/ Alternativa a pandas

/ Operaciones muy rápidas (puede calcular medias, sumas, conteos de columnas de 10⁹ filas por segundo)

/ Integración con cloud

Ventajas

/ No está tan madura como pandas

/ No hay tanta comunidad como pandas

23 of 29

Vaex

Celery worker

Step 1

df_A

Celery worker

Step 2

df_A

df_B

Celery worker

Step 3

df_C

df_D

df_E

df_F

df_A

df_A.hdf5

HDD

df_A.hdf5

df_A.hdf5

df_B.hdf5

24 of 29

Vaex

Transferencia

Lectura

Benchmark

  • xs (~100MB): 2.151s
  • s (~550MB): 3.846s
  • m (~1GB): 8.803s
  • l (~3GB): 24.417s
  • xl (~4GB): 35.418s

25 of 29

Vaex + S3

/ Potencia IO de Vaex

/ Orientado a la nube

Inconvenientes

/ Permite computación distribuida

/ Aprovechamos la concurrencia de s3

Ventajas

/ Vaex no está maduro

/ Más lento que otras opciones

26 of 29

Vaex + S3

Celery worker

Step 1

df_A

Celery worker

Step 2

df_A

df_B

Celery worker

Step 3

df_C

df_D

df_E

df_F

df_A

df_A.chunk1.hdf5

df_A.chunk2.hdf5

df_A.chunk3.hdf5

S3

df_A.chunk1.hdf5

df_A.chunk1.hdf5

df_A.chunk2.hdf5

df_A.chunk3.hdf5

df_A.chunk2.hdf5

df_A.chunk3.hdf5

df_B.chunk1.hdf5

df_B.chunk2.hdf5

df_B.chunk3.hdf5

27 of 29

Vaex + S3

Benchmark

  • xs (~100MB): 8.604s
  • s (~550MB): 15.534s
  • m (~1GB): 36.421s
  • l (~3GB): 107.871s
  • xl (~4GB): 165.35s

28 of 29

Buscamos Gente!

  • Si quieres participar en proyectos innovadores

  • Si eres una persona proactiva que siempre está buscando nuevos retos

  • Si quieres trabajar en una empresa

No lo dudes y contacta conmigo: jf.huete@bluetab.net o por Discord jfhuete#3999

29 of 29

Muchas gracias!