ArrayList, wieviele Elemente?
lima-city → Forum → Programmiersprachen → Java
aktuellen stelle
alten daten
code
container
datenstruktur
element
ermitteln
http
interface
linie
list
menge
operation
parameter
punkt
regel
reservierten speicher
schnittpunkt
url
verwenden
-
Hallo, ich möchte mit BruteForce für eine große Zahl von Linien Schnittpunkte ermitteln.
List<Point> intersections = new ArrayList<Point>(); for(Line line : lines) { for(int i = ++lineNr; i < lines.length; i++) { intersection = line.getIntersection(lines[i]); if(intersection != null) { intersections.add(intersection); } } }
Ab 10.000 Linien kommt die Fehlermeldung
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2245)
at java.util.Arrays.copyOf(Arrays.java:2219)
at java.util.ArrayList.grow(ArrayList.java:213)
at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:187)
at java.util.ArrayList.add(ArrayList.java:411)
Hab schon den Heapspace erweitert, aber die Meldung kommt immer noch. Hab ich vielleicht etwas falsch konfiguriert in der eclipse.ini, oder nimmt die List nur begrenzt viele Elemente auf?
So sieht die eclipse.ini bei mir aus.
-startup plugins/org.eclipse.equinox.launcher_1.2.0.v20110502.jar --launcher.library plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.1.100.v20110502 -product org.eclipse.epp.package.jee.product --launcher.defaultAction openFile --launcher.XXMaxPermSize 256m -showsplash org.eclipse.platform --launcher.XXMaxPermSize 256m --launcher.defaultAction openFile -vmargs -Duser.name=Pixilab <pixilab@googlemail.com> -Dosgi.requiredJavaVersion=1.5 -Xms40m -Xmx512m
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOf(Arrays.java:2245) at java.util.Arrays.copyOf(Arrays.java:2219) at java.util.ArrayList.grow(ArrayList.java:213)
Da will deine ArrayList den reservierten Speicher für sich selber vergrößern, um neue Elemente hinzufügen zu können. In diesem Fall müssen auch die alten Daten an eine neue Stelle kopiert werden, da an der aktuellen Stelle kein Platz mehr da ist. In der Regel wird bei solchen Operationen der reservierte Speicher immer verdoppelt und wenn man beispielsweise vorher 2GB reserviert hat, sind es nun 4GB. Solche Verdoppelungen können also eine Menge ausmachen. Wenn du eine gute Abschätzung hast, wie viele Elemente die ArrayList tragen wird, kannst du deine Abschätzung mit dem Parameter initialCapacity angeben.
Falls das nicht machbar ist, ist es besser eine Datenstruktur zu verwenden, die nicht das RandomAccess Interface implementiert, da dann die ganzen Daten nicht in einem zusammenhängenden Speicherblock liegen müssen. Und die Reihenfolge der Punkte ist dir ja sowieso egal, oder?
Schau einfach mal, welche anderen Container hier infrage kommen: http://docs.oracle.com/javase/7/docs/api/java/util/package-frame.html
Wie gesagt: Diese Container dürfen nicht das RandomAccess Interface implementieren. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage