¿Como optimizar el consumo de memoria en Laravel?

consumo de memoria en Laravel

A veces, se necesita procesar miles y miles de registros y sabemos que esas operaciones son muy pesadas para la memoria ram. Imaginemos una situación: tenemos una tabla con más de 10,000 registros y necesitamos actualizar una columna en especifico, pero no se puede ejecutar sólo una consulta sQL, ya que existe una lógica de PHP detrás.
Por lo tanto un bucle con foreach podría tardar algo de tiempo o terminar con el valor predeterminado de 30 segundos, pero Laravel tiene la solución para eso.

Veamos un simple ejemplo del problema del cual estoy hablando:

¿Puedes ver el problema?; Cuando estamos trabajando con una tabla con pocos registros, 100, 500, no se nota tanto el tiempo, pero trabajar con 10,000, 40,000 ó 1 millón de registros es cuando se comienza a tener problemas, no solo con la velocidad sino también con el almacenamiento de datos que se esta actualizando toda la tabla de la base de datos y es posiblemente que llegue un punto en el cual nos quedemos sin memoria.

Chunk()

Laravel tiene la solución perfecta para esta situación se trata del método chunk(), que nos permite traer resultados de la consulta en bloques para optimizar la carga.

Cambiemos nuestro ejemplo anterior:

En el primer parámetro de la función chunk() estamos definiendo el tamaño del bloque que estaremos usando. En este caso, vamos a cargar 200 resultados, procesarlos, actualizarlo y repetir lo mismo con los próximos 200 así sucesivamente hasta terminar con todos los resultados de la consulta.

Cursor()

A partir de la versión de Laravel 5.2 se agrego el método de eloquent cursor(), que es capaz de utilizar  PDOStatement :: fetch () internamente, para obtener el conjunto de resultados de una consulta. Puesto que el resultado adquirido se devuelve en el generador, que puede ser utilizado como si usáramos el método get().

 

El uso del método de cursor() se supone que es conseguir en menor tiempo una gran cantidad de registros, sin embargo entre más registramos tengamos, mas uso de memoria ram utilizara nuestra consulta.

Bien señores esta es una buena practica de rendimiento para sus consultas, espero que les haya podido ayudar a solucionar este tipo de problema cuando estemos manejando grandes cantidades de registros, si lo que quieres es velocidad en tus peticiones sin importar el uso de la memoria ram el método cursor() es el mas apropiado, sin embargo lo que necesitamos es optimizar el uso de la memoria ram en nuestra aplicación chunk() es el indicado.

Así que  no se les olvide pasar por nuestro canal de slack  Laravel en español y dejarnos saber su comentarios, Saludos.

Comparte este artículo

Entra en la discusión y deja tu comentario

Veces