txt por nodejs linea leer archivo php file large-files

php - nodejs - leer archivo linea por linea javascript



Lectura de archivos muy grandes en PHP (7)

fopen está fallando cuando trato de leer en un archivo de tamaño muy moderado en PHP . A 6 meg file hace estrangular, aunque archivos más pequeños alrededor de 100k están bien. He leído que a veces es necesario recompilar PHP con el -D_FILE_OFFSET_BITS=64 para leer archivos de más de 20 gigas o algo ridículo, pero ¿no debería tener problemas con un archivo de 6 megas? Finalmente, querremos leer en archivos de alrededor de 100 megas, y sería bueno poder abrirlos y luego leerlos línea por línea con fgets, ya que puedo hacerlo con archivos más pequeños.

¿Cuáles son sus trucos / soluciones para leer y hacer operaciones en archivos muy grandes en PHP ?

Actualización: Aquí hay un ejemplo de un bloque de código simple que falla en mi archivo de 6 megas: PHP no parece arrojar un error, simplemente devuelve falso. Tal vez estoy haciendo algo extremadamente tonto?

$rawfile = "mediumfile.csv"; if($file = fopen($rawfile, "r")){ fclose($file); } else { echo "fail!"; }

Otra actualización: Gracias a todos por su ayuda, resultó ser algo increíblemente tonto, un problema de permisos. Mi archivo pequeño inexplicablemente había leído permisos cuando el archivo más grande no lo hizo. Doh!


¿Estás seguro de que está fallando y no de la configuración de tiempo de espera de tu script? El valor predeterminado es generalmente de alrededor de 30 segundos más o menos, y si su archivo tarda más tiempo en leer, es posible que eso suceda.

Otra cosa a tener en cuenta puede ser el límite de memoria en su secuencia de comandos: leer el archivo en una matriz puede tropezar con esto, así que revise su registro de errores en busca de advertencias de memoria.

Si ninguno de los anteriores es su problema, puede buscar el uso de fgets para leer el archivo en línea por línea, procesándolo a medida que avanza.

$handle = fopen("/tmp/uploadfile.txt", "r") or die("Couldn''t get handle"); if ($handle) { while (!feof($handle)) { $buffer = fgets($handle, 4096); // Process buffer here.. } fclose($handle); }

Editar

PHP no parece arrojar un error, simplemente devuelve falso.

¿La ruta a $rawfile correcta en relación con el lugar donde se ejecuta el script? Tal vez intente establecer una ruta absoluta aquí para el nombre del archivo.



Bueno, podrías tratar de usar la función readfile si solo quieres sacar el archivo.

Si este no es el caso, tal vez debería pensar en el diseño de la aplicación, ¿por qué desea abrir archivos tan grandes en las solicitudes web?


Usé fopen para abrir archivos de video para transmisión, usando un script php como servidor de transmisión de video, y no tuve problemas con archivos de más de 50/60 MB de tamaño.


para mí, fopen () ha sido muy lento con archivos de más de 1 mb, file () es mucho más rápido. Solo tratando de leer las líneas 100 a la vez y crear inserciones por lotes, fopen () tarda 37 segundos frente a archivo () tarda 4 segundos. Debe ser ese paso string-> array integrado en el archivo ()

Probaría todas las opciones de manejo de archivos para ver cuál funcionaría mejor en su aplicación.


Hizo 2 pruebas con un archivo de 1.3GB y un archivo de 9.5GF

1.3

Usando fopen()

Este proceso usó 15555 ms para sus cálculos.

Pasó 169 ms en llamadas al sistema

Usando el file()

Este proceso usó 6983 ms para sus cálculos.

Pasó 4469 ms en llamadas al sistema

9.5GB

Usando fopen()

Este proceso usó 113559 ms para sus cálculos

Pasó 2532 ms en llamadas al sistema

Usando el file()

Este proceso usó 8221 ms para sus cálculos

Pasó 7998 ms en llamadas al sistema

Seems file() es más rápido


Si el problema se debe a que se alcanza el límite de memoria, puede intentar establecer un valor más alto (esto podría funcionar o no dependiendo de la configuración de php).

esto establece el límite de memoria en 12 Mb

ini/_set("memory_limit","12M");