Feda /dev/

Troyer

#36780 a mi tampoco me ha dado problemas nunca, supongo que será suerte xd

afhn

A mi tampoco me ha dado problemas nunca, supongo que será porque nunca he tenido.

B

Sería la bomba que tuvieras problemas sin haberla tenido.

4 1 respuesta
Soulscx

"bomba" jeje

afhn

#36783

2
eXtreM3

Cómo se hace para que una función recursiva no de un memory exhausted en Php? De momento sólo he probado a setear todas las variables a null al empezar y les hago un unset al terminar, pero no parece funcionar.

He trackeado la memoria usada en cada iteración con memory_get_usage y memory_get_peak_usage y efectivamente en cada ejecución se va llevando unos 10mb, hasta que llega a los 128 que tengo puesto y casca (obv). No quiero aplicar la solución de aumentar la memoria del script porque tarde o temprano me va a dar el mismo fallo.

3 respuestas
Troyer

#36786 pregunto, para que es la recursividad? 128MB en recursividad me parece una burrada.

1 respuesta
eXtreM3

#36787 me traigo unos datos de la bd, los proceso, y los exporto a excel. Unos 10mb aprox se lleva cada ejecución. Es un cron que ejecuta un proceso que lanza todos los que haya pendientes.

Hay forma de vaciar la memoria o no se puede hacer así?

Edit: pregunta 2: no debería funcionar lo que he intentado de setear a null al empezar y unset al terminar? Otra cosa es que deba hacer lo mismo para las variables de otros modelos que se utilizan, eso no lo he contemplado y puede que funcione. Porque ahora que lo pienso, la variable interna que se genera al exportar un excel suele ser bastante tocha, es más que probable que sea esa la que me está jodiendo.

2 respuestas
Camp1

podrías cachear los datos procesados y ya luego vas generando los excels en cola, no?

Amazon

#36786 uffffff vi una charla hace un tiempo de eso pero no recuerdo ni donde ni cómo localizarla

Troyer

#36788 unset no libera la memoria, borra la variable (la mete en la cola de la basura realmente) y hasta que el compilador no limpia la basura no se libera la memoria, si hay recursividad la memoria no se va a liberar hasta que se resuelva la recursividad.

Si son muchos datos lo que deberías de hacer es establecer un límite, si por cada iteración manejas muchos datos debes de pararla antes, yo lo que haría sería procesar X datos y resolver la recursividad, así hasta que acabe el trabajo.

1 respuesta
HeXaN

Si es que luego queréis que no me meta con los FP, cabrones.

3 1 respuesta
eXtreM3

#36791 esa opción ya la había barajado. Cuando vea que la memoria usada se va acercando al tope, dejando de margen digamos unas 2-3 iteraciones (porque ocupan practicamente lo mismo), corto y sin más.

#36792 causa o consecuencia?

1 respuesta
HeXaN

#36793 ¿Te obligan a hacerlo con recursividad? Si no, hay mejores maneras si no hay dependencias en las operaciones que estás haciendo.

1 respuesta
eXtreM3

#36794 obligar es una palabra muy dura, no debería usarse en entornos laborales.

Quiero que una función se ejecute cuando es terminada hasta que se cumpla una condición. Si se puede hacer de otra forma que no sea recursividad, te escucho.

2 respuestas
ZaO

#36786 https://www.php.net/manual/en/language.generators.overview.php

GlitterSpark

#36795 cualquier algoritmo recursivo se puede escribir iterativamente. No entiendo lo de “otra forma que no sea recursividad”

1 1 respuesta
eXtreM3

#36797 a ver, claro. Puedo poner un while en la función y que termine cuando se cumpla la condición, pero eso me va a dar el memory exhausted igual. Me refería a este caso en particular.

1 respuesta
HeXaN

#36795 Bueno, es que ya vamos cambiando lo de

#36788eXtreM3:

me traigo unos datos de la bd, los proceso, y los exporto a excel.

Qué manía con explicar las cosas a medias. Porque vamos, si es sólo que cito ahí te lo cargas con un MapReduce en cero coma.

1 respuesta
eXtreM3

#36799 es eso, no tiene más ni me he dejado nada a medias. Tengo una lista de cosas por exportar, y hasta que no las exporto todas no termino

foo
¿he terminado?
SI
--- fin
NO
--- proceso y exporto
--- foo
2 respuestas
HeXaN

#36800 Pues un MapReduce sobre la cola de tareas pendientes y a campeonar.

2
Grise
#36798eXtreM3:

me va a dar el memory exhausted igual

No tiene porque ya que no te vas guardando basura en la pila, como si haces al hacer la recursión. Por lo que has contado no tiene sentido hacerlo recursivamente.

2
JuAn4k4

No hay streams? el memory sera por tener todo en memoria: los datos de la bd y el fichero excel abierto con los cambios en memoria. Si puedes leer modo Stream (de x en x) y escribir haciendo appends (csv, tsv, o lo que sea) casi mejor.

Los excel, con segun que libs son una mierda, tienen todo en memoria hasta que guardas), mira a ver si puedes ir flusheando/guardando cambios o algo para ir liberando. O cambia de lib

Seguramente ahi tengas el problema

B

Lo tendré que decir yo... el problema, claramente, es PHP

1
HeXaN

#36800 ¿Cómo lo has implementado al final?

1 respuesta
eXtreM3

#36805 no lo he implementado y sigue dando memory exhausted yolo :smiley:

3 respuestas
HeXaN

#36806 ¿Has probado el MapReduce?

1 respuesta
Troyer

#36806 contrata a un indio que te haga el excel a mano

eXtreM3

#36807 no he podido, ayer tuvimos subida a producción y, literalmente, el servidor explotó. Tuvimos jarana xD

Troyer

Resumen de la función recursiva de @eXtreM3 :

20
Tema cerrado