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:
¡Sus pensamientos sobre la mejor solución son muy apreciados!
Como mencionó en su comentario que la entrada de su tarea es una gran lista de pares de valores clave, recomendaré lo siguiente:
Con el método anterior, podrá:
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!
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.