2012-03-14 8 views
8

Ho un file enorme di circa 10 GB. Devo fare operazioni come ordinare, filtrare, ecc. Sui file in Java. Ogni operazione può essere eseguita in parallelo.Elaborazione di file enormi in java

È consigliabile avviare 10 thread e leggere il file in parallelo? Ogni thread legge 1 GB del file. C'è qualche altra opzione per risolvere il problema con file di grandi dimensioni e elaborarli il più velocemente possibile? NIO è buono per questi scenari?

Attualmente sto eseguendo operazioni in serie e sono necessari circa 20 minuti per elaborare tali file.

Grazie,

+0

Se si ha accesso a più macchine, Map/Reduce potrebbe essere un'altra soluzione che si potrebbe guardare. – Jochen

risposta

11

E 'bene iniziare 10 thread e leggere il file in parallelo?

Quasi certamente non - anche se dipende. Se proviene da un SSD (dove non c'è effettivamente tempo di ricerca), allora forse. Se è un disco tradizionale, decisamente no.

Ciò non significa che non è possibile utilizzare più thread però - è possibile creare un thread per leggere il file, eseguendo solo le attività più rudimentali per ottenere i dati in blocchi elaborabili. Quindi utilizzare una coda produttore/consumatore per consentire più thread processo i dati.

Senza conoscere più di "ordinamento, filtro, ecc." (Che è piuttosto vago) non possiamo davvero dire in che modo il processo è parallelizzabile in primo luogo, ma provare a eseguire l'IO in parallelo su un singolo file probabilmente non aiuta.

1

Provare a profilare il codice per vedere dove sono i colli di bottiglia. Hai provato a fare in modo che un thread legga l'intero file (o il più possibile) e lo dia a 10 thread per l'elaborazione? Se File I/O è il collo di bottiglia (che sembra plausibile), ciò dovrebbe migliorare il tempo di esecuzione complessivo.