Ho un file da 40 MB nel disco e devo "mapparlo" in memoria usando un array di byte.Java: memoria efficiente ByteArrayOutputStream
In un primo momento, ho pensato che scrivere il file in un ByteArrayOutputStream sarebbe il modo migliore, ma trovo che occorra circa 160 MB di spazio heap in qualche momento durante l'operazione di copia.
Qualcuno conosce un modo migliore per farlo senza utilizzare tre volte la dimensione del file della RAM?
Aggiornamento: Grazie per le vostre risposte. Ho notato che potevo ridurre il consumo di memoria dicendo che una dimensione iniziale di ByteArrayOutputStream è leggermente superiore alla dimensione originale del file (utilizzando la dimensione esatta con il mio codice forza la riallocazione, è necessario controllare perché).
C'è un altro punto di memoria alta: quando ottengo il byte [] di nuovo con ByteArrayOutputStream.toByteArray. Dando uno sguardo al suo codice sorgente, posso vedere è la clonazione del matrice:
public synchronized byte toByteArray()[] {
return Arrays.copyOf(buf, count);
}
sto pensando ho potuto solo estendere ByteArrayOutputStream e riscrivere questo metodo, in modo per tornare direttamente l'array originale. C'è qualche potenziale pericolo qui, dato il flusso e l'array di byte non sarà usato più di una volta?
domanda simile http://stackoverflow.com/questions/964332/java-large-files-disk-io-performance – Santosh