Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

319
Vistas
Trabajos en segundo plano de Python con memoria grande

Estoy ejecutando un servidor Flask que carga datos en una base de datos MongoDB. Dado que hay una gran cantidad de datos y esto lleva mucho tiempo, quiero hacerlo a través de un trabajo en segundo plano.

Estoy usando Redis como intermediario de mensajes y Python-rq para implementar las colas de trabajo. Todo el código se ejecuta en Heroku.

Según tengo entendido, python-rq usa pickle para serializar la función que se ejecutará, incluidos los parámetros, y agrega esto junto con otros valores a un valor hash de Redis.

Dado que los parámetros contienen la información que se guardará en la base de datos, es bastante grande (~50 MB) y cuando se serializa y se guarda en Redis, no solo lleva una cantidad considerable de tiempo, sino que también consume una gran cantidad de memoria. Los planes de Redis en Heroku cuestan $30 p/m solo por 100 MB. De hecho, a menudo recibo errores OOM como:

OOM command not allowed when used memory > 'maxmemory'.

Tengo dos preguntas:

  1. ¿Python-rq se adapta bien a esta tarea o sería más apropiada la serialización JSON de Celery?
  2. ¿Hay alguna manera de no serializar el parámetro sino una referencia a él?

¡Sus pensamientos sobre la mejor solución son muy apreciados!

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Como mencionó en su comentario que la entrada de su tarea es una gran lista de pares de valores clave, recomendaré lo siguiente:

  • Cargue su lista de pares clave/valor en un archivo.
  • Cargue el archivo en Amazon S3.
  • Obtenga la URL del archivo resultante y pásela a su tarea RQ.
  • En su tarea de trabajo, descargue el archivo.
  • Analice el archivo línea por línea, insertando los documentos en Mongo.

Con el método anterior, podrá:

  • Divide rápidamente tus tareas en partes manejables.
  • Cargue estos pequeños archivos comprimidos en S3 rápidamente (utilice gzip).
  • Reduzca en gran medida su uso de redis al requerir que se pasen muchos menos datos a través de los cables.
  • Configure S3 para que elimine automáticamente sus archivos después de una cierta cantidad de tiempo (hay configuraciones de S3 para esto: puede hacer que se eliminen automáticamente después de 1 día, por ejemplo).
  • Reduzca en gran medida el consumo de memoria de su trabajador procesando el archivo una línea a la vez.

Para casos de uso como el que está haciendo, esto será MUCHO más rápido y requerirá muchos menos gastos generales que enviar estos elementos a través de su sistema de colas.

¡Espero que esto ayude!

over 4 years ago · Santiago Trujillo Denunciar

0

Resulta que la solución que funcionó es guardar los datos en el almacenamiento de Amazon S3 y luego pasar el URI para que funcione en la tarea de fondo.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda