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

Permalänk
Medlem

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?

Visa signatur

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

Permalänk

"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.

Permalänk
Medlem

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?

Permalänk
Medlem

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.

Visa signatur

Macbook Air 13" (2012)

Permalänk
Medlem
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)).

Permalänk
Medlem

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?

Visa signatur

WS: Mac Studio M1 Max | 32 GB | 1TB | Mac OS
WS: Intel i5 12600K | 64 GB DDR4 @3600 Mhz | 2x1TB nvme 2x1TB SSD SATA | Windows 11 & Manjaro Linux
Bärbar: Macbook Pro 14" | M1 Pro | 16GB RAM | 512GB SSD | Mac OS
Servrar: Intel i7 10700K | 64 GB DDR4 @3600Mhz | 3 TB SSD + 22TB HDD | Unraid |
4x Raspberry pi 4b 8Gb | Dietpi |