2012-11-07 9 views
10

All'interno del mio servizio Web, apro un filestream a un file sul disco locale. Continuo a questo per tutta la durata del servizio. Per ogni query che arriva, io uso il filestream per leggere il disco. Lo faccio per evitare di dover riaprire il filestream su ogni query. La latenza di questo percorso è fondamentale (dovrebbe essere inferiore a pochi ms). Io uso SSD per mantenere il tempo di IO del disco a 0,1 ms o meno.È sicuro tenere aperto C# Filestream per lunghi periodi di tempo?

Può il filestream 'andare male' (diventare non valido) per lunghi periodi di tempo (giorni). È più sicuro riaprire il filestream su ogni query? Se devo riaprire, qual è il sovraccarico di riaprire costantemente un filestream più volte al secondo?

+2

C'è un motivo per cui non stai caricando il contenuto dei file nella memoria statica se ti preoccupi della latenza? Penso che la domanda dovrebbe essere quale modello dovresti utilizzare per accedere rapidamente ai contenuti. – AdamV

+2

Il file è troppo grande per adattarsi alla memoria. Ho un indice che mi consente di cercare direttamente l'offset corretto e di leggere da lì. Non dovrebbe essere più di 1 IO. La quantità di dati letti è piccola. – user201511

+0

Avete scritto un cablaggio di test per provare ad avere un singolo flusso di file aperto rispetto all'apertura e alla chiusura. Ti suggerirei di provare a scrivere un test contro questo e confrontare i risultati. – AdamV

risposta

6

È sicuro mantenere i file aperti per tutto il tempo necessario.

È buono per il tuo caso o meno - devi decidere da solo. La riapertura del file non dovrebbe essere lenta (anche su disco normale), ma devi provare a misurarti come nessuno, ma conosci i tuoi esatti obiettivi di rendimento.

+0

Selezionando questo come risposta, anche se l'altro dà un buon consiglio, poiché questa è l'unica risposta diretta alla mia domanda. – user201511

4

L'unica preoccupazione che avrei lasciato il file aperto è se l'applicazione dovesse fallire, per qualsiasi motivo, e non potesse recuperare dalla sua posizione corrente per chiudere il flusso; il punto CreateFile voce nel KERNEL32 che viene utilizzato per aprire il file rilascia la seguente dichiarazione:

Quando un'applicazione viene terminata utilizzando l'oggetto handle restituito da CreateFile, utilizzare la funzione CloseHandle per chiudere l'handle. Questo non solo libera risorse di sistema, ma può avere un'influenza più ampia su cose come la condivisione di file o dispositivi e l'invio di dati su disco. Specifici sono annotati all'interno di questo argomento come appropriato.

Quindi penso che sia molto più appropriato aprire e chiudere lo FileStream ogni volta.

+0

Sono d'accordo, lasciare un file aperto per la lettura per lunghi periodi di tempo sembra un rischio e contro le migliori pratiche per aprire, leggere e poi chiudere una risorsa. – AdamV

+0

Grazie, sembra che la cosa giusta da fare sia riaprire ogni volta. – user201511

+0

@ user201511, ricorda di contrassegnarlo come la risposta per me stesso e il resto della comunità. –

Problemi correlati