Java BufferedReader vs Filetto consumatore produttore separato

1

Ho un file molto grande delimitato da una sequenza di caratteri '* L * I * N * E'. Il file sarà dell'ordine di 250G. E ogni riga arriva intorno a 600 byte a 1000 byte. Eseguirò le seguenti operazioni sul file,

Leggi il file riga per riga e per ogni riga, lo darò a un parser che eseguirà alcuni calcoli sulla linea e aggiornerà alcune statistiche. Il parser impiegherà circa 15 micros per riga.

A partire da ora sto usando BufferedReader per leggere le righe e passarle al parser in un singolo thread. La mia domanda è se ho un thread di lettura separato che legge solo il file e scarica tutto in una coda (in memoria) e che il mio parser agisce sulla coda in memoria (in un thread separato), posso ottenere un throughput migliore?

Niente cambia tranne che il mio parser agisce sui dati di memoria e un altro thread richiede solo operazioni di IO (leggi il file e scarica in una coda).

È un software complesso in cui il precedente è una parte, quindi sto cercando di accelerare la parte sopra. Quindi non riesco a postare il codice effettivo.

    
posta Mohan Kumar 18.07.2012 - 10:26
fonte

1 risposta

2

La divisione 250G da 600 byte a 1000 byte ti dà circa 250.000.000 di righe. Trascorrere 15 microsecondi durante l'analisi di questi richiederà 3750 secondi, ovvero circa un'ora (un'ora è 3600 secondi).

Circa un'ora sarebbe il tempo impiegato per analizzare l'esecuzione del codice del lettore nella stessa discussione.

Per stimare il guadagno del throughput, la prossima benchmark versione a thread singolo . Per risparmiare tempo avrei probabilmente un benchmark con file di dimensioni più piccole, come 2.5G (il tempo dovrebbe essere moltiplicato per 100 in questo caso) o persino 250Mb (il tempo moltiplicato per 1000).

Con la tempistica a thread singolo con benchmark, otterrei la stima (ottimistica) del guadagno del throughput:

  • i tempi di thread singolo 24 ore mi dare > = 23h nell'esecuzione multithread
  • ... 4h mi darebbe > = 3h
  • ... 2h mi darebbe > = 1h
  • ... 1.5 o meno mi dare > = 1h (sì a meno di 2 ore, l'analisi sarebbe un collo di bottiglia e non la lettura di un file)

In realtà, avendo un benchmark inferiore a 2h, controllerei anche se l'analisi potesse essere eseguita simultaneamente perché in questo caso, avere più di un thread da analizzare potrebbe aumentare il guadagno.

Assume 1MB/s IO, can I achive performance throughput with multithreaded mode?

Supponendo che la lettura del file 250G richieda circa 250.000 secondi. 250 gigabyte equivalgono a 250 migliaia di volte per 1 megabyte.

250.000 secondi è di circa tre giorni. L'analisi di un thread separato ti farebbe risparmiare un'ora o meno di 3 giorni (~ 2% penso). Sta a te decidere se ne vale la pena. Personalmente preferirei pensare a qualcosa come GFS più MapReduce per gestire cose del genere.

    
risposta data 18.07.2012 - 14:20
fonte

Leggi altre domande sui tag