Läsa in text från fil snabbt med java

Trädvy Permalänk
Medlem
Plats
Om jag bara visste
Registrerad
Jul 2001

Läsa in text från fil snabbt med java

Jag håller på med ett projekt där jag ska parsa igenom en relativt stor fil, ~24gb och behandla datan på olika sätt.

Det programmet jag har skrivit har visat sig ta väldigt lång tid att exekvera pga all behandling jag ska göra med det jag läser in. Jag har kört en profiling på programmet för att se var problemet ligger, och just nu verkar det vara inläsningen av filen som kostar för mycket.

Jag använder mig av en FileInputStream --> InputStreamReader --> BufferedReader.

Det jag undrar är alltså om det går att läsa in från en fil på något avsevärt mycket mer optimerat sätt. När jag benchmarkade det i 20 sekunder, så gick 6 av sekunderna till inläsning av filen. För att det ska vara lönt att föra något annat så ska det alltså helst förbättra inläsningen med en faktor 2 eller bättre.

Några förslag?

Du är min fiende tills motsatsen är bevisad, och bevisbördan ligger hos dig.

Trädvy Permalänk
Medlem
Plats
Gävle
Registrerad
Aug 2005

"När jag benchmarkade det i 20 sekunder, så gick 6 av sekunderna till inläsning av filen."

Det säger inte så mkt om du inte oxå säger hur långt in i filen du kom under de där 6 sekunderna. Hur snabbt går det att läsa från disken i ett benchmark-program? Hur snabbt går det om du kommenterar bort all kod som "bearbetar data"?

Jag kan inte hjälpa med java kod men för den som kommer efter mig och vill hjälpa kan det vara nyttigt att veta om det verkligen går att göra det snabbare.

Trädvy Permalänk
Medlem
Registrerad
Feb 2006

Det är ju sekventiell läsning så kolla transferraten du kommer upp i. Ser det ut att finnas nåt att hämta jmfrt med vad hw:n där filen ligger kan leverera?

Trädvy Permalänk
Medlem
Plats
Uddevalla
Registrerad
Okt 2001

har för mig att javas io är väldigt långsam, i skolan använde vi oss av en annan io pga av att javas io tog upp för lång tid när vi skulle lösa olika uppgifter.

Macbook Air 13" (2012)

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Mar 2008
Citat:

Ursprungligen inskrivet av wisdom
har för mig att javas io är väldigt långsam, i skolan använde vi oss av en annan io pga av att javas io tog upp för lång tid när vi skulle lösa olika uppgifter.

En BufferedReader eller BufferedInputStream behöver inte alls vara särskilt långsam. Jag stresstestade en gång en parsningsalgoritm jag hade snickrat ihop själv för en viss typ av konfigurationsdata (textfiler). Jag var rätt nöjd när jag kunde läsa in och parsa ca 150 000 rader på ca 1,5 s, och då tog min (ganska klumpiga) parsning upp lejonparten av den tiden, I/O bara en mindre del.

Sedan beror det ju på vad man upplever som "långsamt"...

För övrigt saknas information från TS om hur han faktiskt använder sin BufferedReader. Inläsningen är snabbare när man använder readLine() jämfört med att läsa ett tecken åt gången, och det är vanligtvis snabbare att läsa till en char[]-buffert än att använda readLine() (som dels skapar nya stränginstanser för varje anrop, dels använder StringBuffer för att skapa dessa, och StringBuffer är något långsam tack vare att den är synkroniserad (trådsäker)).

Trädvy Permalänk
Medlem
Plats
Sverige
Registrerad
Jul 2001

Re: Läsa in text från fil snabbt med java

Citat:

Ursprungligen inskrivet av pSyChO
Jag håller på med ett projekt där jag ska parsa igenom en relativt stor fil, ~24gb och behandla datan på olika sätt.

Det programmet jag har skrivit har visat sig ta väldigt lång tid att exekvera pga all behandling jag ska göra med det jag läser in. Jag har kört en profiling på programmet för att se var problemet ligger, och just nu verkar det vara inläsningen av filen som kostar för mycket.

Jag använder mig av en FileInputStream --> InputStreamReader --> BufferedReader.

Det jag undrar är alltså om det går att läsa in från en fil på något avsevärt mycket mer optimerat sätt. När jag benchmarkade det i 20 sekunder, så gick 6 av sekunderna till inläsning av filen. För att det ska vara lönt att föra något annat så ska det alltså helst förbättra inläsningen med en faktor 2 eller bättre.

Några förslag?

Lagrar du in datan du läser in nånstans? I vad för nåt isåfall?

WS: AMD Ryzen 7 1700 | 16 GB DDR4 | Geforce GTX 1060 OC 6GB | 480 + 256 + 240 + 240 GB SSD | Win10 x64 Professional + Antergos Linux (Arch-derivat)
Bärbar: Macbook Pro Retina 13" | Intel Core I5 2,4Ghz | 16GB RAM | 256GB Flash
Server: 3x HP Proliant microserver Gen8 | 16 GB DDR3 ECC ram | Sammanlagt 26TB HDD | Esxi