Archivo PHP () vs fopen () + fgets () debate sobre el rendimiento

Estoy en proceso de reescribir algunos scripts para analizar los registros generados por la máquina de perl a php. Los archivos varían de 20mb a 400mb Me estoy enfrentando con este problema para decidir si debo usar file () o fopen () + fgets () combo para ir a través del archivo para un rendimiento más rápido.

Aquí está el recorrido básico, verifico el tamaño del archivo antes de abrirlo, y si el archivo es más grande que 100mb (caso bastante raro, pero sucede de tanto en tanto) iré a la ruta fopen + fgets ya que solo toqué el límite de memoria para la secuencia de comandos de 384 mb, cualquier archivo de más de 100 mb tendrá posibilidades de causar un error fatal. De lo contrario, uso file ().

Solo estoy revisando el archivo de principio a fin en ambos métodos, línea por línea.

Aquí está la pregunta: ¿vale la pena mantener el archivo () como parte del código para manejar los archivos pequeños? No sé cómo exactamente file () (también uso la opción SKIP_EMPTY_LINE) funciona en php, ¿asigna el archivo a la memoria directamente o lo introduce línea por línea en la memoria mientras lo revisa? Ejecuté algunos puntos de referencia, el rendimiento es bastante cercano, la diferencia promedio es de aproximadamente 0.1s en un archivo de 40mb y file () tiene una ventaja sobre fopen + fgets alrededor del 80% del tiempo (de 200 pruebas en el mismo conjunto de archivos).

Dejar la parte del archivo podría ahorrarme algo de memoria del sistema, y ​​teniendo en cuenta que tengo 3 instancias del mismo script ejecutándose al mismo tiempo, podría ahorrarme 1G de memoria en un sistema 12G que también aloja la base de datos y otros mierda. Pero no quiero permitir que disminuya también el rendimiento del script, ya que hay como 10k de estos registros entrando por día, la diferencia de 0.1s en realidad se sum.

¡Cualquier sugerencia ayudaría y TIA!

Sugeriría seguir con un mecanismo, como foreach(new \SplFileObject('file.log') as $line) . Divida sus archivos de entrada y trátelos en paralelo, 2-3 veces por núcleo de CPU. Bonificación: menor prioridad que la base de datos en el mismo sistema. En PHP, esto significaría generar N copias de la secuencia de comandos a la vez, donde cada copia tiene su propia lista de archivos o directorio. Ya que está hablando de una reescritura y el rendimiento de IO es un problema, considere otras plataformas con más capacidades aquí, por ejemplo, Java 7 NIO, nodejs asincrónico IO, C # TPL.