2011-02-01 19 views
8

¿Es habitual en tal caso abrir el archivo una sola vez?¿Debo mantener un archivo abierto o debo abrir y cerrar a menudo?

#!/usr/bin/env perl 
use warnings; 
use 5.012; 
use autodie; 

my $file = 'my_file'; 

open my $fh, '>>', $file; 
say $fh "Begin"; 
close $fh; 

$SIG{INT} = sub { 
    open my $fh, '>>', $file; 
    say $fh "End"; 
    close $fh; 
    exit 
}; 

my $result; 
while (1) { 
    $result++; 
    # ... 
    # ... 
    # ... 
    open my $fh, '>>', $file; 
    say $fh $result; 
    close $fh; 
    sleep 3; 
} 

Respuesta

20

Respuesta corta: Casi siempre, usted debe abrir/cerrar una sola vez. Detalles a continuación.

La decisión de si hacer eso depende de 4 cosas:

  1. ¿hay otros procesos que pueden necesitar escribir en el archivo?

    Si es así, puede que necesite bloquear el archivo, y el buen comportamiento para un proceso diseñado para uso concurrente es liberar el recurso compartido bloqueado lo más rápido posible para que otros puedan obtener el bloqueo.

  2. ¿Hay MUCHOS archivos que necesita abrir?

    Si es así, es posible que se quede sin controladores de archivo con demasiados archivos abiertos, por lo que debe cerrar.

  3. Cuánta tolerancia tiene para perder datos en el archivo si el programa falla.

    Si necesita guardar los datos del búfer en el archivo, debe vaciarlos. Esto PUEDE hacerse cerrando con frecuencia, aunque una solución mejor es el enjuague frecuente o el enjuague automático en el identificador de archivo que se enciende.

  4. ¿Le preocupa mucho no poder cerrar el archivo después de quedarse sin espacio en disco?

    Si es así, cuanto más cierre/vuelva a abrir el archivo, menos datos perderá debido a que el sistema de archivos está lleno, así que lo que haya escrito desde la última open se ha ido.

En cualquier otro escenario, solamente de apertura/cierre una vez (bueno, más quizá cerca extra en __DIE__ manejador y END{} bloque (y la mayoría del tiempo, es probable que sea en otros escenarios).

Eso es porque abrir/cerrar el archivo solo desperdicia recursos del sistema sin razón alguna Y alarga el código. Para ser más específicos, abrir y cerrar archivo son operaciones costosas, que requieren ambas llamadas al sistema (que pueden forzar el salto al kernel desde el usuario) , y disco adicional IO, que es MUY costoso en cuanto a los recursos. Para verificarlo, ejecute alguna utilidad de medición de utilización del sistema en su O S, y ejecuta un script Perl que no hace nada excepto abrir/cerrar 10000 nombres de archivos diferentes 100 veces cada uno.

Tenga en cuenta (con respecto a los escenarios # 3/# 4) que si se preocupa mucho por no perder ningún dato, no debe usar el archivo IO en primer lugar - use una base de datos o un sistema de mensajería con garantías de entrega .

+0

Además, la cantidad de sobrecarga que desea encontrar con toda la apertura y el cierre: no son operaciones sin costo. –

+0

Pensé en incluir las consideraciones de simultaneidad y bloqueo en mi respuesta, pero decidí que era un poco demasiado tangencial a su pregunta. Sin embargo, es posible que esté combinando abrir/cerrar con bloqueo y enrojecimiento. Como señala correctamente que debe manejar la coherencia de los datos frente a un posible acceso concurrente, se debe usar el bloqueo, y para minimizar la contención de bloqueos y el riesgo de incoherencia de archivos/búferes uno debe enjuagarse explícitamente después de las operaciones de escritura. –

+0

@ S.Lott - eso está bajo el título genérico de "recursos del sistema de desechos", pero ampliaré un poco :) – DVK

4

Es costumbre, para la programación normal, abrir cada archivo y mantener el archivo abierto durante el tiempo que su procesamiento aún tenga uso.

Excepciones a esto serían si el manejo de archivos se limitara a partes específicas del código (inicialización y apagado, por ejemplo) o eventos específicos y relativamente raros (un manejador de señal vinculado a volver a leer una configuración o actualización estadística o volcados de depuración).

En el ejemplo que muestra que las operaciones adicionales de apertura y cierre son completamente superfluas (y probablemente sean costosas en términos de rendimiento y sobrecarga del sistema).

Cuestiones relacionadas