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");