2012-11-07 5 views
10

In meinem Web-Service öffne ich einen Filestream zu einer Datei auf dem lokalen Datenträger. Ich behalte das für die Lebenszeit des Dienstes herum. Für jede eingehende Abfrage verwende ich den Filestream, um den Datenträger zu lesen. Ich mache dies, um zu vermeiden, den Filestream bei jeder Abfrage neu zu öffnen. Die Latenz dieses Pfades ist kritisch (sollte weniger als wenige ms betragen). Ich verwende SSD, um die IO-Zeit der Festplatte auf 0,1 ms oder weniger zu halten.Ist es sicher, C# Filestream für längere Zeit offen zu halten?

Kann der Filestream über längere Zeiträume (Tage) "fehlerhaft" (ungültig) werden. Ist es sicherer, den Filestream bei jeder Abfrage neu zu öffnen? Wenn ich wieder öffnen muss, was ist der Aufwand, einen Filestream mehrmals pro Sekunde zu öffnen?

+2

Gibt es einen Grund, warum Sie den Inhalt der Dateien nicht im statischen Speicher laden, wenn Sie sich um Latenzzeiten sorgen? Ich denke, die Frage sollte sein, welches Muster Sie verwenden sollten, um schnell auf die Inhalte zuzugreifen. – AdamV

+2

Die Datei ist zu groß, um in den Speicher zu passen. Ich habe einen Index, mit dem ich direkt zum richtigen Offset suchen und von dort lesen kann. Es sollte nicht mehr als 1 IO sein. Die Menge der gelesenen Daten ist gering. – user201511

+0

Haben Sie eine Testumgebung geschrieben, um zu versuchen, einen einzigen Dateistrom geöffnet zu haben, im Gegensatz zu Öffnen und Schließen? Ich würde vorschlagen, dass Sie versuchen, einen Test dagegen zu schreiben und die Ergebnisse zu vergleichen. – AdamV

Antwort

6

Es ist sicher, Dateien so lange offen zu halten, wie Sie benötigen.

Ist es gut für Ihren Fall oder nicht - Sie müssen selbst entscheiden. Erneutes Öffnen der Datei sollte nicht langsam sein (selbst bei normaler Fahrt), aber Sie müssen versuchen, sich selbst als niemand zu messen, aber Sie kennen Ihre genauen Leistungsziele.

+0

Wählen Sie dies als die Antwort, obwohl der andere einen guten Rat gibt, da dies die einzige direkte Antwort auf meine Frage ist. – user201511

4

Das einzige Problem, das ich hätte, die Datei offen zu lassen, wäre, wenn die Anwendung aus irgendeinem Grund fehlschlagen würde und nicht von ihrem aktuellen Standort wiederhergestellt werden könnte, um den Stream zu schließen; der CreateFile Eintrittspunkt in KERNEL32, die zum Öffnen der Datei verwendet wird, macht die folgende Anweisung:

Wenn eine Anwendung fertig ist mit dem Objekt-Handle von Createfile zurückgegeben, verwenden Sie die Funktion Closehandle den Griff zu schließen. Dies gibt nicht nur Systemressourcen frei, sondern kann auch einen größeren Einfluss auf Dinge wie das Teilen der Datei oder des Geräts und das Übertragen von Daten auf die Festplatte haben. Einzelheiten werden in diesem Thema entsprechend aufgeführt.

Also ich würde denken, dass es viel angemessener ist, die FileStream jedes Mal zu öffnen und zu schließen.

+0

Ich stimme zu, eine Datei für das Lesen für längere Zeit offen zu lassen scheint wie ein Risiko und gegen Best Practices für das Öffnen, Lesen und Schließen einer Ressource. – AdamV

+0

Danke, es klingt wie das Richtige zu tun ist, jedes Mal wieder zu öffnen. – user201511

+0

@ user201511, bitte denken Sie daran, es als die Antwort für mich selbst und den Rest der Gemeinschaft zu markieren. –

Verwandte Themen