Che cosa è un modo efficiente per un'applicazione multithread Java in cui molti thread devono leggere esattamente lo stesso file (> 1 GB di dimensione) ed esporlo come flusso di input? Ho notato che se ci sono molti thread (> 32), il sistema inizia a contendersi su I/O e ha un sacco di attesa I/O.Multithreading Java che legge un singolo file di grandi dimensioni
Ho pensato di caricare il file in un array di byte condiviso da tutti i thread: ogni thread creerebbe un ByteArrayInputStream, ma l'allocazione di un array di byte da 1 GB non funzionerebbe correttamente.
Ho anche preso in considerazione l'utilizzo di un singolo FileChannel e ogni thread che crea un InputStream su di esso utilizzando Channels.newInputStream(), tuttavia sembra che sia il FileChannel che mantiene lo stato di InputStream.
Ogni thread ha bisogno dell'intero contenuto del file? O ognuno può cercare i dati rilevanti di cui ha bisogno? –
Ogni thread deve leggere l'intero file. – bob
Il sistema ha 8 GB di memoria e non mi dispiacerebbe assegnare un array da 1 GB. Ma la JVM non sembra proprio gradire questo: usa il 100% della CPU cercando di allocare l'array per un tempo molto lungo. – bob