Leer archivo grande y manipularlo

Iniciado por chucky2183, 18 Diciembre 2015, 18:39 PM

0 Miembros y 1 Visitante están viendo este tema.

chucky2183

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.

engel lex

usas fopen y con fread no lees todo sino solo una sección de X bytes por vez... así no sobrecargas el proceso
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

_Zume

#2
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.

chucky2183

#3
Cita de: _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.

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).



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.

#!drvy

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 (php) [Seleccionar]
$file = new SplFileObject('archivo.txt');

while(!$file->eof()){
    $linea = $file->fgets();
}

$file = null;


Saludos