2012-01-17 15 views
6

Ho bisogno di inviare immagini e piccoli file video (circa 5 MB, meno di 10 MB) a un servizio REST, che scriverò. Mi chiedo se dovrei usare Byte [] o Stream per svolgere questo compito. Quale sarebbe la linea di demarcazione in termini di dimensioni del file di trasferimento tra l'utilizzo di Byte [] e Stream?Quando utilizzare l'array di byte e quando utilizzare lo streaming?

risposta

9

La quantità di memoria disponibile che si è disposti a impegnare per la transazione è l'unica vera limitazione.

Se si dispone di un file 5M, è necessario caricare l'intero contenuto nella RAM, che avrà un costo di 5 milioni.

Se si esegue lo streaming, è possibile utilizzare molta meno memoria, leggendo piccoli blocchi dal file in un buffer riutilizzabile e scrivendo tali blocchi sul flusso HTTP.

5

In definitiva, invierai un flusso in entrambi i casi.

Se hai ricevuto i dati da un'altra fonte al di fuori del tuo controllo come il massiccio byte[], allora potresti anche tenerlo in tale forma per l'elaborazione a meno che non sia scomodo per te, e lasciarlo spingere nel flusso di rete verso il basso la linea.

Se lo si riceve come uno streaming, non ha senso trasformarlo in un enorme byte[] solo per averlo spostato su un altro stream. Usa un buffer di 4 o 8 kiB (4 o 8 anziché 4 a 8, in quanto vi sono alcuni vantaggi minori nelle coincidenze di numero intero di pagine di memoria di quelle che puoi trarre vantaggio da).

Se lo si sta creando da soli, lo streaming è più semplice per la maggior parte dei casi (avvolgere in un file binario o in uno scrittore di testi e lavorare su quello) e anche più efficiente.

Più in generale, se vedo un buffer di oltre 8kiB che viene scritto o letto da un flusso, allora noterò che come prima cosa provare a cambiare se le cose sembrano essere troppo lente.

0

Il test generale quando si sceglie tra un array di byte o un flusso dipende se si sa, in anticipo, quanti byte ci sono nei dati e se questo numero è ragionevolmente piccolo per lo scopo dato.

Ad esempio, se si ha a che fare con un piccolo file di icona (meno di 50 KB) disponibile sul computer locale e si conosce il file, utilizzare un array di byte.

Al contrario, se si sta lavorando con un filmato in cui sarebbe difficile, per non dire inutile, tenere in memoria 2 GB di contenuto in una sola volta, utilizzare uno stream.

Gli stream sono ideali per la gestione di insiemi di dati di grandi dimensioni o di dati la cui lunghezza non è nota in anticipo.

Problemi correlati