Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: chucky2183 en 18 Diciembre 2015, 18:39 pm



Título: Leer archivo grande y manipularlo
Publicado por: chucky2183 en 18 Diciembre 2015, 18:39 pm
Hola. Tengo un archivo de texto grande de 100mb. El archivo posee 1600000 lineas, en cada linea hay un proveedor con sus porcentajes de impuestos. Necesito manipular 1600 proveedores que tengo en la DB y actualizar sus impuestos. Es decir los 1600 proveedores de la DB los tiene que comparar 1 a 1 con cada linea del archivo.

Intento solo leer el archivo e imprimirlos y se me muere el programa. Llega a procesar unos 7 minutos y medio y tira un error 500. Pero en el log de apache no aparece el error.

Hay alguna forma de leer el archivo por partes? Ya le subi los tiempos en los archivos de configuracion pero aun asi el programa muere.


Título: Re: Leer archivo grande y manipularlo
Publicado por: engel lex en 18 Diciembre 2015, 18:45 pm
usas fopen y con fread no lees todo sino solo una sección de X bytes por vez... así no sobrecargas el proceso


Título: Re: Leer archivo grande y manipularlo
Publicado por: _Zume en 19 Diciembre 2015, 08:11 am
Yo que tú paso todos los datos a una tabla y comienzo a compararlos desde MySQL, así tienes más libertad para tratarlos además y podrías utilizar el sscanf para filtrar los datos.

Aunque para serte sincero no entendí bien, tienes 1600000 lineas, y necesitas manipular solo 1600 ?

_____________


Por cierto, yo hace meses quería sacar un montón de imágenes de una web (casi 10.000, y estaban ordenadas por números 1.jpg, 2.jpg, etc ..) y hice un código para copiar todas las  imágenes a un directorio pero tuve problema de sobre-carga, así que lo que hice fue pasarlo a un img lleno de todas las URL que habían con un bucle, y también tuve el problema, así que añadí un sleep(0.25); y lo logró, no sé si funcione.


Título: Re: Leer archivo grande y manipularlo
Publicado por: chucky2183 en 21 Diciembre 2015, 13:26 pm
Yo que tú paso todos los datos a una tabla y comienzo a compararlos desde MySQL, así tienes más libertad para tratarlos además y podrías utilizar el sscanf para filtrar los datos.

Seria lo ideal. Pero al leer el archivo se muere. Si intento insertar 1600000 tuplas en la DB, va a ser peor.

Aunque para serte sincero no entendí bien, tienes 1600000 lineas, y necesitas manipular solo 1600 ?

El funcionamiento es asi. Tengo 1600 proveedores cargados en la base de datos, y cada mes bajo un archivo de retenciones de la AFIP (Administracion Federal de Ingresos Publicos). El archivo que bajo pesa unos 100Mb y posee aproximadamente 1600000 lineas. En cada linea hay un proveedor (CUIT, % de RETENCION, y otros datos mas).

(http://i.imgur.com/kvbz21i.png)

Tengo que actualizar el % de retencion en los 1600 proveedores que tengo en la base de datos. Cada 1 de los 1600 proveedores los tengo que comparar con el archivo.
_____________


Por cierto, yo hace meses quería sacar un montón de imágenes de una web (casi 10.000, y estaban ordenadas por números 1.jpg, 2.jpg, etc ..) y hice un código para copiar todas las  imágenes a un directorio pero tuve problema de sobre-carga, así que lo que hice fue pasarlo a un img lleno de todas las URL que habían con un bucle, y también tuve el problema, así que añadí un sleep(0.25); y lo logró, no sé si funcione.


Título: Re: Leer archivo grande y manipularlo
Publicado por: #!drvy en 21 Diciembre 2015, 14:28 pm
Usa fgets o la clase SplFileObject (POO). Así cargaras el archivo linea por linea sin cargarlo totalmente en memoria. Por otra parte imprimir las lineas no es precisamente un trabajo fácil y consume memoria. Asegúrate de hacerlo de la forma mas optimizada posible.

Código
  1. $file = new SplFileObject('archivo.txt');
  2.  
  3. while(!$file->eof()){
  4.    $linea = $file->fgets();
  5. }
  6.  
  7. $file = null;

Saludos