Java läsa stor fil java.lang.OutOfMemoryError: Java heap space

Permalänk

Java läsa stor fil java.lang.OutOfMemoryError: Java heap space

Hej

Jag har ett litet problem när jag skall läsa in en stor fil (233MB) i java för att sedan använda datan.
Filen är på 20000 rader de 10000 första inehåller 2 "poster" och varje rad därefter inehåller 5000 "poster"

Tänkte fråga om någon har en bra lösning på detta här är min kod för att läsa in från fil och den fungerar på mindre filer men ej på den stora.

Den kommer till rad ~17600 sedan får den java.lang.OutOfMemoryError: Java heap space

Koden körs på en i7-860 @3.8Ghz och 8GB RAM i programmet eclipse

MVH The_Phenom

public void readFile(String path) { BufferedReader in = null; try { in = new BufferedReader(new InputStreamReader(new DataInputStream(new FileInputStream(path)))); String line; while ((line = in.readLine()) != null) { if (line.contains("#")) { } else if (line.contains("=")) { tempVar = line.split("="); n = Integer.parseInt(tempVar[1]); persons = new String[n * 2 + 1]; persons[0]="x"; pref = new LinkedList[n * 2 + 1]; } else if (line.contains(":")) { tempVar = line.split(": "); int i = Integer.parseInt(tempVar[0]); tempVar = tempVar[1].split(" "); pref[i] = new LinkedList<Integer>(); for (int j = 0; j < tempVar.length; j++) { pref[i].add(Integer.parseInt(tempVar[j])); } } else { tempVar = line.split(" "); if (!(tempVar[0].isEmpty())) { int i = Integer.parseInt(tempVar[0]); persons[i] = tempVar[1]; } } } } catch (Exception e) { e.printStackTrace(); } }

Permalänk
Medlem

För det första borde du kunna byta ut det här:

in = new BufferedReader(new InputStreamReader(new DataInputStream(new FileInputStream(path))));

Mot det här:

in = new BufferedReader(new FileReader(path));

Sen tror jag inte att det har så mycket med storleken på filen att göra som det har med storleken på alla listorna du skapar utifrån datan i filen, det bästa är nog att försöka effektivisera den delen så gott det går. Så länge det finns referenser till listorna så kommer inte GCn att rensa upp något minne och det slutar med det där felet. Den enda lösningen jag kan se är egentligen att läsa in mindre data åt gången, göra det du ska med den, låta GCn rensa minne, och sen läsa in nästa chunk.

Permalänk

Problemet är dock att jag måste kunna ändra alla listorna från t.ex sista listan

Det hela handlar om Gale–Shapley algorithm till Stable marriage problem med 5000 par

http://en.wikipedia.org/wiki/Stable_marriage_problem

Permalänk

Skriv programmet i C++ istället så får du bättre kontroll på minneshanteringen?

Permalänk

Hej har löst det nu genom att exekvera jar filen i terminalen istället för direkt i eclipse
Tydligen kan eclipse inte använda mer än 2GB ram och det krävdes ~3GB ram för att köra den stora filen

Tack för hjälpen

Permalänk
Medlem

Ett tips är att hämta in mindre data i chunks istället för att hämta in allt på en gång.

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?

Permalänk
Medlem
Skrivet av xzhaskd:

Inte om man behöver all data för att lösa problemet, lösningen var som sagt att öka det minne som java kunde använda.

Ja, det stämmer.

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?

Permalänk
Medlem
Skrivet av The_Phenom:

Hej har löst det nu genom att exekvera jar filen i terminalen istället för direkt i eclipse
Tydligen kan eclipse inte använda mer än 2GB ram och det krävdes ~3GB ram för att köra den stora filen

Tack för hjälpen

Jag tror att du kan sätta parametrarna eclipse kör java med, men det kanske inte är så ofta du läser in gigantiska filer.

Visa signatur

Citera eller nämn gärna mig (@ToJa92) om du svarar på något jag skrivit.
Uppskattar du eller blir hjälpt av ett inlägg jag skrivit är jag tacksam om du gillar det.

Permalänk
Medlem

Går samma kurs, hade samma problem, och löste sig tack var den här tråden. Tackar

Permalänk
Skrivet av ToJa92:

Jag tror att du kan sätta parametrarna eclipse kör java med, men det kanske inte är så ofta du läser in gigantiska filer.

Problemet var dock att när jag försökte sätta -Xmx n högre än 1250m i eclipse fick jag felmeddelandet att eclipse inte kunde reservera så mycket minne trots att jag hade 6GB ledigt

funkade att göra den till en jar fil och köra den från terminalen med -Xmx4000m utan problem dock behövde den bara 3GB

Permalänk
Skrivet av The_Phenom:

Problemet var dock att när jag försökte sätta -Xmx n högre än 1250m i eclipse fick jag felmeddelandet att eclipse inte kunde reservera så mycket minne trots att jag hade 6GB ledigt

funkade att göra den till en jar fil och köra den från terminalen med -Xmx4000m utan problem dock behövde den bara 3GB

Mer 64 bitars åt folket, helt enkelt!

Visa signatur

Citera, tack!
Har du läst tråden om strandhögtalare och andra musiklådor?

Permalänk
Skrivet av magnusvmt:

Går samma kurs, hade samma problem, och löste sig tack var den här tråden. Tackar

Hehe gött