Foros del Web » Programando para Internet » PHP »

Ejecutar codigo que requiere de mucho uso de memoria

Estas en el tema de Ejecutar codigo que requiere de mucho uso de memoria en el foro de PHP en Foros del Web. Hola a todos: Estoy tratando de generar un fichero .xslx (Excel 2007) usando la libreria PHPExcel y el contenido lo obtengo desde unas tablas en ...
  #1 (permalink)  
Antiguo 07/04/2012, 20:27
 
Fecha de Ingreso: marzo-2011
Ubicación: Caracas
Mensajes: 140
Antigüedad: 13 años, 1 mes
Puntos: 1
Ejecutar codigo que requiere de mucho uso de memoria

Hola a todos:
Estoy tratando de generar un fichero .xslx (Excel 2007) usando la libreria PHPExcel y el contenido lo obtengo desde unas tablas en la BD pero resulta que una de esas tablas tienes cerca de 4000 registros por lo cual el script ocupa mas de 64MB de memoria que es nivel maximo permitido por el hosting y por ende me saca el famoso mensaje "fatal error allowed memory size of ...". He probado poniendo un php.ini en el directorio raiz de mi aplicacion y modificar el valor de la memoria pero no me esta permitido. Alguna sugerencia de como ejecutar el script para obtener los 4000 registros y generar el fichero Excel?

Saludos y gracias por adelantado
__________________
Reynier Perez Mira
Skype: reynierpm
Site: http://www.reynierpm.com
  #2 (permalink)  
Antiguo 08/04/2012, 00:01
Avatar de repara2  
Fecha de Ingreso: septiembre-2010
Ubicación: München
Mensajes: 2.445
Antigüedad: 13 años, 7 meses
Puntos: 331
Respuesta: Ejecutar codigo que requiere de mucho uso de memoria

Utiliza ini_set() para aumentar el valor de memoria dentro del bucle que genera el archivo, creo que la directiva es MAX_EXECUTION_TIME:

http://de.php.net/manual/es/function.ini-set.php

Saludos
__________________
Fere libenter homines, id quod volunt, credunt.
  #3 (permalink)  
Antiguo 08/04/2012, 06:57
 
Fecha de Ingreso: marzo-2011
Ubicación: Caracas
Mensajes: 140
Antigüedad: 13 años, 1 mes
Puntos: 1
Respuesta: Ejecutar codigo que requiere de mucho uso de memoria

No sirve, ya lo he probado
__________________
Reynier Perez Mira
Skype: reynierpm
Site: http://www.reynierpm.com
  #4 (permalink)  
Antiguo 08/04/2012, 08:00
Avatar de wsoul  
Fecha de Ingreso: octubre-2010
Mensajes: 190
Antigüedad: 13 años, 6 meses
Puntos: 13
Respuesta: Ejecutar codigo que requiere de mucho uso de memoria

y no puedes ir metiendo los datos poco a poco?

100 lineas, luego se reinicia el script y otras 100 lineas y así todo el rato ?
__________________
Compra y Vender artículos en https://www.losredactores.com o una comunidad de webmasters ? https://webeamos.com
  #5 (permalink)  
Antiguo 08/04/2012, 08:02
 
Fecha de Ingreso: marzo-2011
Ubicación: Caracas
Mensajes: 140
Antigüedad: 13 años, 1 mes
Puntos: 1
Respuesta: Ejecutar codigo que requiere de mucho uso de memoria

Eso es precisamente lo que quiero hacer solo que no se me ocurre el "como" hacerlo por eso pedi la ayuda.
__________________
Reynier Perez Mira
Skype: reynierpm
Site: http://www.reynierpm.com
  #6 (permalink)  
Antiguo 08/04/2012, 08:15
Avatar de wsoul  
Fecha de Ingreso: octubre-2010
Mensajes: 190
Antigüedad: 13 años, 6 meses
Puntos: 13
Respuesta: Ejecutar codigo que requiere de mucho uso de memoria

en la tabla de la db pones un campo mas

estado int 1 defualt 0

de la db haces una consulta que saque 100 y los meta y a la vez les ponga el estado en 1.

al terminar recarga de nuevo el archivo

al comenzar comprueba si aun existen estado='0' y listo y si no hay die()
__________________
Compra y Vender artículos en https://www.losredactores.com o una comunidad de webmasters ? https://webeamos.com
  #7 (permalink)  
Antiguo 08/04/2012, 08:31
Avatar de gjx2  
Fecha de Ingreso: agosto-2008
Ubicación: R.D
Mensajes: 1.153
Antigüedad: 15 años, 8 meses
Puntos: 139
Respuesta: Ejecutar codigo que requiere de mucho uso de memoria

Y no seria mejor hacer uso de un limit a la consulta.

Código SQL:
Ver original
  1. SELECT * FROM TABLA LIMIT 0,100  
  2. SELECT * FROM TABLA LIMIT 100,100
  3. SELECT * FROM TABLA LIMIT 200,100
  4. ........
  #8 (permalink)  
Antiguo 08/04/2012, 09:21
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 15 años, 11 meses
Puntos: 528
Respuesta: Ejecutar codigo que requiere de mucho uso de memoria

La situación es esta: phpexcel almacena todas las celdas del libro en memoria, por lo cual no podrías hacerlo de manera parcial. Una alternativa sería intentar hacer uso de la configuración de uso de memoria de phpexcel, indicando que guarde en disco en vez de memoria

($cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_disc ISAM;
PHPExcel_Settings::setCacheStorageMethod($cacheMet hod);)

aunque en mis pruebas no me ha funcionado como esperaba.

Si no puedes aumentar la cantidad de memoria, te sugiero utilizar el excelwriter de pear, sólo podrás crear archivos tipo excel 95, pero consume mucha menos memoria, y salvo algunas opciones de formato muy avanzadas, sigue siendo excel y por tanto compatible.
  #9 (permalink)  
Antiguo 08/04/2012, 09:40
 
Fecha de Ingreso: marzo-2011
Ubicación: Caracas
Mensajes: 140
Antigüedad: 13 años, 1 mes
Puntos: 1
Respuesta: Ejecutar codigo que requiere de mucho uso de memoria

Cita:
Iniciado por wsoul Ver Mensaje
en la tabla de la db pones un campo mas

estado int 1 defualt 0

de la db haces una consulta que saque 100 y los meta y a la vez les ponga el estado en 1.

al terminar recarga de nuevo el archivo

al comenzar comprueba si aun existen estado='0' y listo y si no hay die()
Esa opcion no la puedo usar dado que no puedo modificar la BD
__________________
Reynier Perez Mira
Skype: reynierpm
Site: http://www.reynierpm.com
  #10 (permalink)  
Antiguo 08/04/2012, 09:44
 
Fecha de Ingreso: marzo-2011
Ubicación: Caracas
Mensajes: 140
Antigüedad: 13 años, 1 mes
Puntos: 1
Respuesta: Ejecutar codigo que requiere de mucho uso de memoria

Cita:
Iniciado por ocp001a Ver Mensaje
La situación es esta: phpexcel almacena todas las celdas del libro en memoria, por lo cual no podrías hacerlo de manera parcial. Una alternativa sería intentar hacer uso de la configuración de uso de memoria de phpexcel, indicando que guarde en disco en vez de memoria

($cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_disc ISAM;
PHPExcel_Settings::setCacheStorageMethod($cacheMet hod);)

aunque en mis pruebas no me ha funcionado como esperaba.

Si no puedes aumentar la cantidad de memoria, te sugiero utilizar el excelwriter de pear, sólo podrás crear archivos tipo excel 95, pero consume mucha menos memoria, y salvo algunas opciones de formato muy avanzadas, sigue siendo excel y por tanto compatible.
Hmmm este paquete (excel writer) segun dice aca http://pear.php.net/package/Spreadsheet_Excel_Writer no esta siendo mantenido y de hecho esta en BETA y no quiero que me traiga problemas pues luego tendria que calarmelos yo porque soy el desarrollador y sobre lo que me comentas de PHPExcel en que lugar deberia poner ese codigo que mencionas, me dejas algun ejemplo?
__________________
Reynier Perez Mira
Skype: reynierpm
Site: http://www.reynierpm.com
  #11 (permalink)  
Antiguo 08/04/2012, 09:45
 
Fecha de Ingreso: marzo-2011
Ubicación: Caracas
Mensajes: 140
Antigüedad: 13 años, 1 mes
Puntos: 1
Respuesta: Ejecutar codigo que requiere de mucho uso de memoria

Cita:
Iniciado por gjx2 Ver Mensaje
Y no seria mejor hacer uso de un limit a la consulta.

Código SQL:
Ver original
  1. SELECT * FROM TABLA LIMIT 0,100  
  2. SELECT * FROM TABLA LIMIT 100,100
  3. SELECT * FROM TABLA LIMIT 200,100
  4. ........
Asi lo estoy haciendo y con 100 registros me funciona pero como hago para re-ejecutar la misma consulta comenzando en el registro 101 y adicionandolo a la hoja de calculo creada con PHPExcel?
__________________
Reynier Perez Mira
Skype: reynierpm
Site: http://www.reynierpm.com
  #12 (permalink)  
Antiguo 08/04/2012, 09:53
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 15 años, 11 meses
Puntos: 528
Respuesta: Ejecutar codigo que requiere de mucho uso de memoria

excel writer de pear no está siendo mantenido, ya fue abandonado, no obstante funciona perfectamente, para crear hojas con datos de todo tipo, incluyendo formatos, colores, freeze panes etc.

Te repito, dado que phpexcel almacena todas las celdas en memoria, aún si quieres hacerlo por partes agregando datos, no funcionaría.

Etiquetas: compartido, cpanel, excel, hosting, mysql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:47.