2011-10-10 30 views
5

¿Hay una diferencia notable (en teoría) al leer un línea por línea en comparación con la lectura de todo el archivo de una vez?Rendimiento al leer un archivo línea por línea vs leer todo el archivo

Leer todo el archivo tiene un impacto negativo en la cantidad de memoria utilizada, pero ¿funciona más rápido?

Necesito leer un archivo y procesar cada línea. No sé si debería leer una línea a la vez y procesarla, o leer todo el archivo, procesar todo y luego escribir en la salida.

Ya he configurado el prgm para leer línea por línea y quiero saber si vale la pena el esfuerzo de cambiarlo para leer todo el archivo (no es fácil dada mi configuración).

Gracias,

+1

En teoría, el disco podría tener que buscar y leer con más frecuencia en un programa línea por línea, dependiendo de qué más esté sucediendo. En la práctica, esto puede no ser un problema, ya que la E/S de archivos almacenados en búfer probablemente se esté usando para leer en bloques más grandes. Su millaje variará dependiendo de los detalles de su hardware y su algoritmo. Al optimizar, debe esperar escribir varias iteraciones de su programa, agregar un código de temporizador o utilizar un generador de perfiles para averiguar qué es lo que más tiempo lleva. – holtavolt

Respuesta

0

Para ser honesto, después de estudiar la eficiencia por un tiempo durante mi grado, llegué a la conclusión de esto acerca de su pregunta: depende con qué frecuencia se va a leer este archivo. Si lo lees una vez, hazlo todo, porque eso liberaría el proceso para otras tareas. Una vez más, una cosa más a tener en cuenta es que el archivo va a editarse más tarde y requerirá una actualización (como en la parte actualizada solamente). Si es así, puede necesitar establecer un marcador para recrear dónde leer (y luego nuevamente ¿con qué frecuencia se actualiza?). Pero sí, si es un trabajo de una sola vez, continúe y léalo como un todo, siempre y cuando no requiera que se creen tokens de ciertos literales en el archivo. espero que esto ayude.

+0

En cualquier sistema operativo * nix moderno o de Windows, este tipo de cosas (almacenamiento en búfer, compartir entre procesos, marcar actualizaciones) todo se hace por el sistema operativo. –

+0

Estoy de acuerdo ... a veces, cuando las personas toman la eficiencia demasiado en serio, ¡la empeoran! eso es implementando/interfiriendo el almacenamiento en búfer, compartiendo entre procesos, marcando actualizaciones. –

0

La lectura del archivo completo en la memoria generalmente no es una buena idea porque los archivos pueden ser enormes y ocupar mucha memoria y, en el peor de los casos, quedarse sin memoria. Por lo tanto, para equilibrar el rendimiento y el uso de memoria, lee un bloque de archivos en un búfer y analiza el búfer. Cuando termine de procesar el bloque, lea el siguiente bloque hasta EOF.

Decidir sobre un buen tamaño de bloque tendrá que hacerse en función de lo que quiere lograr.

+1

¡El sistema de archivos hará todo este "bloqueo" por usted! Su llamada gestión de búfer, la implementación de su propio almacenamiento en búfer en la parte superior del almacenamiento en búfer del sistema operativo solo le ralentizará. –

+0

@James Anderson - Tienes razón :) Acabo de hacerlo exclusivo ya que el OP mencionó "en teoría". – srikanta

2

Leer el archivo completo será un poco más rápido, ¡pero no mucho!

Pero tenga cuidado al leer todo el archivo no es escalable ya que está limitado por la memoria disponible en el sistema, una vez que el tamaño del archivo excede el tamaño de RAM disponible para su programa, comenzará a usar el espacio de intercambio será mucho más lento. Si el tamaño del archivo excede el tamaño de la memoria virtual disponible, su programa se bloqueará.

0

Un factor es la cantidad de datos que va a leer y, por lo tanto, la duración inicial de ejecución del programa, es decir, si hay algún beneficio en trabajar en el rendimiento.

Consulte las cotizaciones del libro en this answer para algunos buenos consejos generales sobre cómo pensar en el rendimiento del software.

(sé que usted es una respuesta en la teoría, pero este aspecto de cuándo debe preocuparse por el rendimiento también es importante, siempre que tenga una cantidad finita de tiempo para pasar.)

1

Como otros, Creo que hacer lecturas más grandes mejorará un poco el rendimiento de su aplicación, pero no espere milagros, las E/S ya están almacenadas en la capa del sistema operativo, por lo que solo aumentará al reducir la sobrecarga de tener demasiadas llamadas de lectura. Leer todo el archivo de una vez es peligroso, a menos que sepa el tamaño máximo posible para sus archivos de entrada. Un enfoque más razonable es leer el archivo en bloques grandes.

Si quiere mejorar aún más, debería considerar superponer las E/S con el procesamiento. Digamos que lees el archivo de entrada en bloques de 128MB. En su hilo principal lee el primer bloque de 128 MB y luego lo pasa a un hilo de trabajo para su procesamiento. Mientras el hilo de trabajo se pone a trabajar, el hilo principal lee el segundo bloque de 128 MB. A partir de ese momento, mientras el hilo de trabajo está procesando el bloque N, el hilo principal lee el bloque N + 1 del disco.

0

Creo que dependería de las necesidades de su aplicación (como la mayoría de las cosas, lo sé). Leer un archivo de 1 MB en el Nodo js es ~ 3-4x más rápido con fs.readFile() que usar una secuencia legible o un lector de línea tan lejos como sea posible. Las transmisiones pueden ofrecer un rendimiento adicional si el archivo es muy grande y está procesando entradas sobre la marcha. También puede ser ideal si su aplicación ya está consumiendo mucha memoria, ya que un proceso de nodo tiene un ~ 1.5 GB de límite de memoria en sistemas de 64 bits. Procesar fragmentos a medida que entran también puede ser más eficaz si el origen de los datos es lento en relación con la rapidez con que la CPU puede procesarlo (archivos en HDD o cinta, conexiones de red como TCP). En lo que respecta a la lectura de un archivo en la memoria frente a la transmisión a la memoria, supongo que la función llamada sobrecarga de emisión de eventos de datos y el cambio a la devolución de llamada de la función de procesamiento ralentizan el proceso.

Cuestiones relacionadas