2013-02-27 12 views
7

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 
+0

Quante unità disco sono i file distribuiti su? O sono tutti memorizzati sulla stessa unità? –

+2

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

+0

I file sono in memoria memorizzati in un byte []. le unità disco non sono rilevanti qui. @RJRyV – DotNet

risposta

3

Come stai in realtà "distribuendo il calcolo "? È prevista la sincronizzazione? Stai semplicemente creando 8 thread per leggere gli 8 file?

Su quale piattaforma si sta eseguendo (linux, windows, ecc.)? Ho visto un comportamento apparentemente strano dallo scheduler di Windows prima di spostare un singolo processo da core a core per provare a bilanciare il carico tra i core. Questo ha finito per causare prestazioni più lente del semplice consentire a un singolo core di essere utilizzato più del resto.

+0

La sincronizzazione tra gli oggetti era il problema Grazie Brett. – DotNet

2

Quanta memoria è il tuo sistema a dondolo?

8 x 1,7 GB, overhead del sistema operativo, potrebbe significare che la memoria virtuale/cercapersone sta entrando in gioco. Che è ovviamente molto più lento della RAM.

Apprezzo che tu dica che ogni file è in memoria, ma in realtà hai 16 GB di RAM libera o se ne sta andando avanti a un livello astratto?

Se anche l'interruttore di contesto deve cambiare continuamente le pagine, ciò spiegherebbe un tempo maggiore.

+0

Grazie per la tua risposta, ho una memoria abbastanza grande da contenere i dati. – DotNet