Große Daten und große Array

fatfox

Bekanntes Mitglied
Hallo Leute,

Ich arbeite jetzt mit ziemlich große Daten. Ich möchte eine riesen Array erzeugen, so "int[][] bigdata = new int[17770][17770];", Aber mein Computer report immer Fehler: Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

Ich denke, die Array kostet zu viel Speicher, deshalb lehnt der Computer ab zu arbeiten.

Weiß jemand, wie man mit große Array arbeiten kann?

Vielen Dank für die Bemühung!
 
Kommt drauf an... Entweder dein heap space vergrößern, damit java mehr Speicher zur verfügung hat, oder Algo optimieren (falls möglich), oder sowas wie Paging implemetieren (auch falls möglich)... Die letzten Punkte hängen aber direkt mit der Aufgabenstellung zusammen.
 
Hallo fatfox,

hab zwar noch keine eigenen Erfahrungen mit solch großen Arrays gemacht, aber den Heap Space, den deine Javaanwendung zur Verfügung gestellt wird, kannst du mit den Parametern
-Xms512m
-Xmx1024m
hochsetzen.
 
Man kann den Heap Space erhöhen.
Allerdings bräuchte man alleine für das Array gute 1,2 GB (wenn ich mich da jetzt nicht verrechnet habe)
- ist das notwendig?
 
17770 * 17770 * 4Byte > 1MB
Sorg dafür dass die VM auch mindestens so viel Memory zur Verfügung hat, dann klappt es auch.
Java selbst kennt keine Einschränkung die bei so kleinen ;-) Datenstrukturen schon greifen würde.

Siehe z.B. hier beim Titel "Tuning the Java Heap"

EDIT: hi hi 2 Antworten während ich am tippen bin --- die Frage ob notwenig oder nicht ist irrelevant - etwas über 1MB ist für Java auch kein Thema....

-X... ist die Lösung ;-)
 
Zuletzt bearbeitet:
Hi, XHelp und oetzi,

wie kann ich die heap space erhöhen?

java -Xms512m -Xmx2048m ??? Ich habe den Command direkt in die Konsole eingegeben, dann bekomme ich eine kommische Help docu. Wie kann ich den Befehl richtig geben? Ich bin Linux green hand....

Michael...

Ich habe keine Ahnung wie viele Platz die Array braucht und wie man sie rechnen kann, Wenn keine Lösung finden, muss ich andere Methode ausdenken...
 
wie kann ich die heap space erhöhen?
Startest du das ganze aus Eclipse bzw. einer andere IDE? Dann such einfach mal nach "IDENAME heapspace", da werden brauchbare anleitungen dabei sein. Bei Eclipse läuft es darauf hinaus, dass du eclipse.ini veränderst.
Ich habe keine Ahnung wie viele Platz die Array braucht und wie man sie rechnen kann
Ein int ist 32 bit lang = 4 byte. Du hast 17770*17770-Stück davon....
 
17770 * 17770 * 4Byte > 1MB
Sorg dafür dass die VM auch mindestens so viel Memory zur Verfügung hat, dann klappt es auch.
Java selbst kennt keine Einschränkung die bei so kleinen ;-) Datenstrukturen schon greifen würde.

Siehe z.B. hier beim Titel "Tuning the Java Heap"

Hi Andi,

Kannst du mir mehr verraten, wie kann ich das Problem lösen? (Ich lese gerade die Link, die du mir geschick hast. Ich denke, ich so -Xmx***m eigeben). Aber wo und wie? Ich benutze Ubungtu und Eclipse... bin noch ein Java Anfänger... :-(
 
Hi XHelp und Andi_CH,

Ich habe in eclipse.ini so verändert:

[JAVA=18]
-Xms512m
-Xmx1024m
[/code]

Reicht es?

Aber meine Programm funktioniert irgendwie noch nicht, immer die selber Fehlermeldung...
 
Nein, das ist die falsche Stelle, da Du in der eclipse.ini die Heap-Werte für Eclipse selbst definierst (sprich für die JVM in der Eclipse ausgeführt wird). (Mal abgesehen davon, wird Xmx1024m nicht reichen, da ja bereits errechnet wurde, dass das Array über 1,2GB verbraucht.)

Führst Du aus Eclipse aber eigene Programme aus, wird dafür eine eigen JVM erzeugt.

Also,
- öffne in Eclipse Dein Projekt
- klicke im Menü "Run" auf "Run Configurations..."
- wähle im linken Baum Deine Applikation aus, bzw. erstelle eine neue sofern sie da noch nicht ist
- rechterhand geh auf die Registerkarte "Arguments"
- im Feld "VM arguments:" trägst Du die -Xms und -Xmx Werte ein
- "Apply" -> "Run" und alles sollte fein sein

So mal grob beschrieben, aber es gibt sicher auch tolle Anleitungen im Netz mit Screenshots 😉
 
Ich denke eher, dass da ein Designfehler vorliegt. Wofür brauchst du 17000Zeilen/Spalten?

Ich arbeite mit eine Riesen Daten, Ich möchte für alle zwei Bücher die Anzahl der gemeinsamen Usern finden. Ich habe 17770 Bücher....,deshalb möchte ich so eine riesen Array erzeugen.

Aber ist die Array riesen groß? Braucht es 1,2 G? oder wie Andi_CH gesagt, das ist eigentlich nicht so groß?
 
Vermutlich hat Andi_CH einmal zu viel durch 1024 dividiert.
(aber generell liegt er nicht ganz falsch mit der Aussage. Der Speicher den du brauchst ist tatsächlich größer als 1mb 😉 )
Welche Bücher? Welche Benutzer?
Aber generell: du brauchst bestimmt nicht alle Daten _gleichzeitig_ im Speicher zu halten. Du kannst es bestimmt auch Zeilenweise/Knotenweise auswerten
 
Auch wenn Du mit vielen Daten arbeitest, musst Du die alle zur gleichen Zeit im Speicher halten?
Kannst Du nicht nur ein paar einlesen, verarbeiten, weiter einlesen, verarbeiten, usw?

Und es sind ~ 1,2GB (weiß nicht, wie Andi auf 1MB kommt 😉 )

17770 * 17770 * 4(byte) = 1263091600 Byte = 1233487,890625 KB = 1204,5780181884765625 MB = 1,17634572088718414306640625 GB

😉

Edit: Ich glaube, hier sind zur Zeit zuviele Leute im Thread... man kommt mit den Antworten ja nicht mehr zeitnah hinterher 😉
 
Hi XHelp und Andi_CH,

Ich habe in eclipse.ini so verändert:

[JAVA=18]
-Xms512m
-Xmx1024m
[/code]

Reicht es?

Aber meine Programm funktioniert irgendwie noch nicht, immer die selber Fehlermeldung...

Ja logisch - damit gibst du Eclipse mehr Memory - deine Applikation hat nichts davon
Nimm das ruhig wieder raus - Eclipse lief ja zuvor auch

Stichworte:
In Eclipse:
Run - Run Configurations
Java Appliation
<Dein Programm>
Arguments
VM arguments

Da sind die Argumente für die VM die dann deine Applikation ausführt anzugeben

Schreibs mal da rein

EDIT:
Noch was 512 und 1024 wird wohl kaum reichen, da ja dein Array schon über 1MB belegt - geh mal auf 2048 oder noch höher
 
Zuletzt bearbeitet:
Danke alle! Ich habe es richtig eingestellt, jetzt funktioniert mein Programm. 😀

Aber ihr habt recht, dass so viel Datei einmal arbeiten ist echt dumm, ich muss eine neue Methode für Zeilenweise oder Knotenweise ausdenken!

Danke!!!!!!!!!!!!!😀
 
1MB in einer Datenstruktur mag vielleicht viel sein, aber eine anständige Applikation belegt durchaus auch einmal etwas mehr Memory ...
 
Andi, ohne Dich jetzt angreifen zu wollen, aber liest Du Dir auch alle Beiträge im Thread durch, die in der Zwischenzeit geschrieben wurden?

1.) hatte ich bereits eine Step-by-step Anleitung geschrieben gehabt, wie man die VM Argumente setzen kann
2.) wurde bereits mehrfach erwähnt, dass es sich nicht um 1MB sondern 1GB handelt

Ist mir nur so mal aufgefallen 😉
 
Wir waren gleichzeitig am Tippen - wie ich begonnen habe, stand dein Beitrag noch nicht da ....

17770 * 17770 = 315772900
315772900 * 8 = 2526183200
2526183200 / (1024*1024) = 2409.16

Komisch jetzt komme ich 2.35 GB - die 10er Potenz ging unter -
Komisch ist nur dass mit 17770*17770 mein helloworld Programm startete und mit 27770*27770 Musste ich auf 4096 ???? Egal- ich taste mich immer ran und rechne selten 🙂

EDIT: Fehler um Faktor 2 oben ein int ist 4 Byte .....

1.18GB
 
Zuletzt bearbeitet:

Zurück
Oben