Devo trasferire file di grandi dimensioni tra computer su connessioni non affidabili tramite WCF.Memorystream e heap di oggetti di grandi dimensioni
Perché voglio essere in grado di riprendere il file e non voglio essere limitato nel mio file di WCF, sto tagliando i file in pezzi da 1 MB. Questi "pezzi" vengono trasportati come stream. Che funziona abbastanza bene, finora.
I miei passi sono:
- aperta filestream
- lettura pezzo da file in byte [] e creare MemoryStream
- trasferimento pezzo
- torna a 2. fino a quando l'intero file viene inviato
Il mio problema è nel passaggio 2. Presumo che quando creo un flusso di memoria da un array di byte, finirà sul LOH e l'ultima causa solo un'eccezione eccezionale. Non sono riuscito a creare questo errore, forse mi sbaglio nella mia ipotesi.
Ora, non voglio inviare il byte [] nel messaggio, poiché WCF mi dirà che la dimensione dell'array è troppo grande. Posso modificare la dimensione massima dell'array consentito e/o la dimensione del mio blocco, ma spero che ci sia un'altra soluzione.
mia domanda reale (s):
- La mia soluzione attuale creare oggetti sul LOH e volontà che mi causare problemi?
- C'è un modo migliore per risolvere questo?
Btw .: Sul lato ricevente, leggo semplici pezzi più piccoli dal flusso in arrivo e li scrivo direttamente nel file, quindi non sono coinvolti grandi array di byte.
Edit:
soluzione attuale:
for (int i = resumeChunk; i < chunks; i++)
{
byte[] buffer = new byte[chunkSize];
fileStream.Position = i * chunkSize;
int actualLength = fileStream.Read(buffer, 0, (int)chunkSize);
Array.Resize(ref buffer, actualLength);
using (MemoryStream stream = new MemoryStream(buffer))
{
UploadFile(stream);
}
}
Grazie mille! Questa è una risposta davvero brillante. Grazie per aver segnalato il problema Array.Resize. Inoltre non ho mai sentito parlare di BufferManager, sembra che questo mi aiuterà molto anche in altre aree. Questo è molto più di quanto mi aspettassi, quindi ho pensato di iniziare una piccola taglia e darla a te, ma devo aspettare 23 ore dopo aver iniziato una taglia ...Quindi devi aspettare anche tu :) – flayn
Grazie per quello. Sono davvero felice di poter essere d'aiuto. Fammi sapere se c'è qualcos'altro. Guardando indietro, potrebbe valere la pena sottolineare che l'implementazione ottimale dovrebbe condividere una singola istanza di BufferManager attraverso l'intero servizio. Non so quanto sarebbe pratico per te. –
+1 Ho appena imbattuto in questo in cerca di una risposta a un problema simile. Mai sentito parlare di BufferManager prima - fantastico! Credo che questo sarà qualcosa da ricordare per il futuro. –