2009-08-13 8 views
6

Qual è l'approccio consigliato per ottenere le migliori prestazioni quando è necessario creare file di testo superiori a 10   MB?Come ottengo le migliori prestazioni da .NET StreamWriter in C#?

Ci sono più sezioni nel codice che devono scrivere cose in un singolo file. Questo significa molte righe di testo.

Opzione # 1 (Questa logica sarà chiamato in diversi momenti):

  1. creare un'istanza
  2. StreamWriter Scrivi alcune linee (secondo alcuni la logica di business)
  3. Chiudere l'istanza StreamWriter

Opzione # 2:

  1. Creare uno StreamWriter all'inizio del programma
  2. Scrivere tutte le righe da diverse sezioni del codice.
  3. Chiude StreamWriter alla fine quando non è necessario scrivere nient'altro.

Opzione n. 3: Qualsiasi altro?

Ricordare che il file di output potrebbe essere maggiore di 10   MB.

risposta

13

Tenere aperto un solo scrittore sarà più efficiente dell'apertura e della chiusura ripetute. Se si tratta di dati importanti, tuttavia, è necessario chiamare Flush() dopo ogni scrittura per assicurarsi che arrivi al disco.

Il programma è multi-thread? In tal caso, potresti desiderare di avere una coda produttore/consumatore - avere un singolo thread che recuperi gli elementi per scrivere dalla coda e scriverli, quindi altri thread possono liberamente mettere gli articoli in coda.

Sei sicuro di avere effettivamente un problema di prestazioni? 10MB è piuttosto piccolo in questi giorni ... sul mio netbook ci vogliono ancora solo un secondo o due per scrivere 10 MB (e no, non è un disco a stato solido).

0

Utilizzare un oggetto StringBuilder per concatenare il testo e solo aprire e scrivere una volta nel file.

+0

Un StringBuilder memorizzerà l'intero file in memoria. – David

+0

10 MB di memoria !? Questo è inaudito! ;-) –

0

In entrambi gli scenari 1 e 2, è necessario chiedersi se è necessario l'accesso simultaneo al file. In questo caso nello scenario 2 StreamWriter non è un'opzione poiché non è sincronizzata. Nello scenario 1 è necessario aprire ogni StreamWriter in modo tale da ottenere un blocco esclusivo sul file.

Assumendo l'accesso sequenziale, non andrei mai con lo scenario 2. Richiede il passaggio di StreamWriter a ciascuna sezione di codice che ne ha bisogno. E chi è responsabile della chiusura dello scrittore di nuovo. Questo diventerà rapidamente non mantenibile.

Lo scenario 1 ha lo svantaggio di dover aprire uno StreamWriter ovunque ne sia necessario uno, che diventa anche non mantenibile. Inoltre, ora devi sapere in ogni sezione del codice la posizione del file.

Vorrei un involucro singleton attorno a StreamWriter in modo da poterlo utilizzare ovunque, come desiderato, senza creare molte dipendenze dallo stesso StreamWriter.

0

Basta mescolare entrambi gli approcci ... Utilizzare un buffer che consente di memorizzare solo quanto si vuole in memoria. Una volta superata tale dimensione, il buffer verrà scritto sul disco e pulito.

Problemi correlati