2011-09-05 12 views
9

Qual è la dimensione del buffer sensibile da utilizzare durante il trasferimento (indipendentemente da UP/DOWN) di file di grandi dimensioni (3-4 giga) con Java?Dimensione del buffer sensibile durante il download di file in Java

byte buf[] = new byte[1024] 

o

byte buf[] = new byte[5 * 1024 * 1024] 

A volte anche se si utilizza un buffer di grandi dimensioni e passare ad una lettura (array di byte []) Metodo questo non garantisce che si otterrà una piena 5 me tampone . Nei miei test ho osservato che la dimensione media è di solito 1.5kb per read() invocazione. Questo ha senso per le prestazioni? Sarei felice se qualcuno potesse indicarmi una risorsa che discute il problema con maggiori dettagli.

risposta

10

suona come si sta leggendo da una connessione di rete (TCP?)

1500 byte è l'Ethernet di default MTU, il che spiega il motivo per cui si sta ricevendo in genere 1.5KB per lettura. L'MTU può essere spesso aumentato a 9 KB configurando gli stack di rete per utilizzare jumbo frames.

Con questo in mente, non vi è quasi certamente alcun punto nel rendere buf superiore a 9 KB. L'uso di un buffer più piccolo (ad esempio oltre 1 KB) può influire negativamente o negativamente sulle prestazioni.

In ogni caso, l'unico modo per ottenere una risposta definitiva è attraverso l'analisi comparativa di varie dimensioni del buffer.

+0

Hmz, buon punto. Non ho realmente preso in considerazione la MTU dello stack TCP. – LordDoskias

+1

L'utilizzo di buffer più grandi ridurrà il numero di scambi tra codice Java e codice nativo e potrebbe avere un impatto sulle prestazioni, indipendentemente dalle dimensioni del pacchetto di rete. – jarnbjo

+0

Come dimostra la mia esperienza il buffer da 8-100KB è abbastanza buono. – umbr

1

Nella mia ricerca & test, 8K è la dimensione ottimale del buffer quando si legge da un socket su Linux con Java 6. Se si assegna un buffer maggiore di 8K, sarà semplicemente uno spreco di spazio. Ho letto che la chiamata nativa Java rende utilizza un buffer 8K e questo è il motivo per cui 8K è ottimale, ma ho perso il mio riferimento. C'è un bug che indica questo fatto ma non è una prova conclusiva: http://bugs.sun.com/view_bug.do?bug_id=6444633

Detto questo, prova a sperimentare sulla piattaforma che ti interessa distribuire e troverai la dimensione ottimale del buffer. Se sei pigro, 8K è un ottimo predefinito.

Problemi correlati