Implementación de un Pipeline de Procesamiento de Datos con Corrutinas en PHP
En PHP, el manejo de grandes cantidades de datos puede ser un desafío. Tradicionalmente, procesar estos datos implica iteraciones secuenciales, que pueden ser lentas y consumir muchos recursos. Las corrutinas, disponibles a través de extensiones como ext-parallel
(si bien requiere instalación y configuración), o implementaciones basadas en generators, nos permiten construir un pipeline de procesamiento de datos eficiente, dividiendo la tarea en etapas y ejecutándolas de forma aparentemente concurrente.
Este post mostrará cómo implementar un pipeline básico usando generators, que están disponibles de forma nativa en PHP, para procesar datos simulados, transformándolos en varias etapas.
<?php
/**
* Etapa 1: Genera datos de ejemplo.
* @param int $count Número de elementos a generar.
*/
function dataGenerator(int $count): Generator
{
for ($i = 1; $i <= $count; $i++) {
yield $i;
}
}
/**
* Etapa 2: Eleva al cuadrado los datos recibidos.
* @param Generator $source Generador de datos de entrada.
*/
function square(Generator $source): Generator
{
foreach ($source as $item) {
yield $item * $item;
}
}
/**
* Etapa 3: Filtra los números pares.
* @param Generator $source Generador de datos de entrada.
*/
function filterEven(Generator $source): Generator
{
foreach ($source as $item) {
if ($item % 2 === 0) {
yield $item;
}
}
}
/**
* Etapa 4: Imprime los resultados.
* @param Generator $source Generador de datos de entrada.
*/
function printer(Generator $source): void
{
foreach ($source as $item) {
echo $item . PHP_EOL;
}
}
Ahora, vamos a conectar estas etapas para formar el pipeline completo. La clave es pasar la salida de una etapa como entrada a la siguiente.
<?php
// Genera 10 números.
$data = dataGenerator(10);
// Eleva al cuadrado.
$squared = square($data);
// Filtra los pares.
$evenNumbers = filterEven($squared);
// Imprime los resultados finales.
printer($evenNumbers);
Este enfoque modular facilita la prueba y el mantenimiento del código. Cada etapa se puede probar individualmente y se pueden agregar o modificar etapas fácilmente sin afectar el resto del pipeline. Para grandes volúmenes de datos, considera ajustar el tamaño del chunk de datos que se procesan en cada iteración para optimizar el uso de la memoria. Aunque los generators son más eficientes que cargar todo el conjunto de datos en la memoria, el manejo cuidadoso de la memoria sigue siendo crucial.
Además, para un verdadero paralelismo, considera usar la extensión ext-parallel
o librerías como ReactPHP
que permiten operaciones asíncronas, mejorando aún más el rendimiento del pipeline.
No hay comentarios:
Publicar un comentario