Ho 8 file. Ognuno di loro è di circa 1,7 GB. Sto leggendo quei file in un array di byte e quell'operazione è abbastanza veloce.BufferedReader in un ambiente multi-core
Ogni file viene quindi letta come segue:
BufferedReader br=new BufferedReader(new InputStreamReader(new ByteArrayInputStream(data)));
Quando elaborati usando un singolo core in un senso sequenziale ci vuole abour 60 secondi. Tuttavia, quando si distribuisce il calcolo su 8 core separati ci vuole molto più tempo di 60 secondi per file.
Poiché i dati sono tutti in memoria e non vengono eseguite operazioni IO, avrei supposto che non occorressero più di 60 secondi per elaborare un singolo file per core. Quindi, il totale di 8 file dovrebbe essere completato in poco più di 60 secondi, ma questo non è il caso.
Mi manca qualcosa sul comportamento di BufferedReader? o uno qualsiasi dei lettori utilizzati nel codice sopra.
Potrebbe pena ricordare che sto usando questo codice per caricare i file prima:
byte[] content=org.apache.commons.io.FileUtils.readFileToByteArray(new File(filePath));
Il codice su tutto simile a questo:
For each file
read the file into a byte[]
add the byte[] to a list
end For
For each item in the list
create a thread and pass a byte[] to it
end For
Quante unità disco sono i file distribuiti su? O sono tutti memorizzati sulla stessa unità? –
Per file così grandi, ti consiglio vivamente di utilizzare NIO. Si prega di consultare questo articolo: http://www.javalobby.org/java/forums/t17036.html, potrebbe essere utile – n1ckolas
I file sono in memoria memorizzati in un byte []. le unità disco non sono rilevanti qui. @RJRyV – DotNet