Soll ich eine Datei offen halten oder sollte ich oft öffnen und schließen?

8

Ist es in einem solchen Fall üblich, die Datei nur einmal zu öffnen?

%Vor%     
sid_com 01.02.2011, 20:11
quelle

2 Antworten

20

Kurze Antwort: Fast immer sollten Sie nur einmal öffnen / schließen. Details unten.

Die Entscheidung, ob das zu tun ist, hängt von 4 Dingen ab:

  1. Gibt es andere Prozesse, die möglicherweise in die Datei schreiben müssen?

    Wenn dies der Fall ist, müssen Sie die Datei möglicherweise sperren, und das gute Verhalten für einen Prozess für die gleichzeitige Verwendung besteht darin, die gesperrte freigegebene Ressource so schnell wie möglich freizugeben, damit andere die Sperre erhalten können.

  2. Gibt es VIELE Dateien, die Sie öffnen müssen?

    Wenn das so ist, haben Sie möglicherweise keine Dateihandles mit zu vielen geöffneten Dateien mehr, also müssen Sie schließen.

  3. Wie viel Toleranz haben Sie für den Verlust von Daten in der Datei, wenn das Programm abstürzt.

    Wenn Sie die Daten aus dem Puffer in die Datei speichern müssen, müssen Sie sie spülen. Dies kann durch häufiges Schließen erreicht werden, obwohl eine bessere Lösung entweder häufiges Spülen oder automatisches Abschalten bei aktivierter Dateikennung ist.

  4. Ist es Ihnen sehr wichtig, dass Sie die Datei nicht schließen können, wenn nicht mehr genügend Speicherplatz vorhanden ist?

    Wenn ja, je öfter Sie die Datei schließen / erneut öffnen, desto weniger Daten verlieren Sie, weil das Dateisystem voll ist, also was immer Sie geschrieben haben, seit der letzte open weg ist.

In jedem anderen Szenario nur einmal öffnen / schließen (na ja, plus vielleicht extra close in __DIE__ handler und END{} block (und die meiste Zeit, Sie werden wahrscheinlich in anderen Szenarien sein ).

Der Grund dafür ist, dass das Öffnen / Schließen der Datei Systemressourcen ohne Grund verschwendet und Ihren Code länger macht. Um genauer zu sein, sind das Öffnen und Schließen von Dateien kostspielige Operationen, die sowohl Systemaufrufe (die den Sprung vom Benutzerland zum Kernel erzwingen können) als auch zusätzliche Platten-IO erfordern, was SEHR teuer ist. Um dies zu überprüfen, führen Sie ein Dienstprogramm zur Systemauslastungsermittlung in Ihrem Betriebssystem aus und führen Sie ein Perl-Skript aus, das nur 100 verschiedene Dateinamen je 100 Mal öffnet / schließt.

Beachten Sie (in Bezug auf die Szenarien # 3 / # 4), dass Sie, wenn Sie Wert darauf legen, keine Daten zu verlieren, an erster Stelle keine Datei-IO verwenden sollten - eine Datenbank oder ein Messaging verwenden System mit Liefergarantien.

    
DVK 01.02.2011, 20:16
quelle
4

Bei der normalen Programmierung ist es üblich, jede Datei zu öffnen und den geöffneten Dateigriff so lange zu behalten, wie Ihre Verarbeitung dafür noch genutzt wird.

Ausnahmen davon wären, wenn die Dateiverarbeitung auf bestimmte Teile des Codes beschränkt wäre (z. B. Initialisierung und Herunterfahren) oder auf bestimmte und relativ seltene Ereignisse (ein Signal-Handler, der mit dem erneuten Lesen einer Konfiguration oder dem Aktualisieren von Statistik oder Debugging verbunden ist) Dumps).

In dem Beispiel, das Sie zeigen, sind die zusätzlichen Operationen zum Öffnen und Schließen völlig überflüssig (und sind wahrscheinlich teuer in Bezug auf den Systemaufwand und den Systemaufwand).

    
Jim Dennis 01.02.2011 20:18
quelle

Tags und Links