ho generare un file molto grande .csv da un database utilizzando il metodo descritto nelUnbuffered uscita molto lenta
https://stackoverflow.com/a/13456219/141172
Funziona bene, fino a un certo punto. Quando il file esportato è troppo grande, ottengo uno OutOfMemoryException
.
se spengo buffer di uscita che modificando il codice come questo:
protected override void WriteFile(System.Web.HttpResponseBase response)
{
response.BufferOutput = false; // <--- Added this
this.Content(response.OutputStream);
}
il file download. Tuttavia, sono diversi gli ordini di grandezza più lenti di quando è stato abilitato il buffering dell'output (misurato per lo stesso file con buffering true/false, su localhost).
Capisco che è più lento, ma perché rallenterebbe a una scansione relativa? C'è qualcosa che posso fare per migliorare la velocità di elaborazione?
UPDATE
sarebbe anche la possibilità di utilizzare File(Stream stream, String contentType) come suggerito nei commenti. Tuttavia, non sono sicuro di come creare stream
. I dati vengono assemblati dinamicamente in base a una query DB e MemoryStream esaurisce la memoria fisica contigua. I suggerimenti sono ben accetti
UPDATE 2
È stato suggerito nei commenti che alternativamente la lettura dal database e la scrittura al flusso sta causando un degrado. Ho modificato il codice per eseguire la scrittura del flusso in un thread separato (utilizzando il pattern produttore/consumatore). Non c'è una differenza apprezzabile nelle prestazioni.
Non capisco il motivo per cui è necessario che la risposta collegata. Cosa c'è di sbagliato semplicemente restituendo 'File (myStream," text/csv ")' dalla tua azione? http://msdn.microsoft.com/en-us/library/dd493017(v=vs.100).aspx –
Sto leggendo quello sbagliato? Stai trasmettendo il flusso di output della risposta come input per il contenuto? Che quindi scrive nuovamente sul flusso di output della risposta? Di quale classe stai sovrascrivendo il metodo WriteFile? –
@ ta.speot.è: non sono sicuro di come creare 'myStream'. I dati vengono assemblati dinamicamente in base a una query DB e MemoryStream esaurisce la memoria fisica contigua. Puoi mostrare un pattern per creare un 'myStream' che può essere passato a' File (myStream, "text/csv") '? –