kostenloser Webspace werbefrei: lima-city


ArrayList, wieviele Elemente?

lima-cityForumProgrammiersprachenJava

  1. Autor dieses Themas

    pixilab

    Kostenloser Webspace von pixilab

    pixilab hat kostenlosen Webspace.

    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
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. 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.
  4. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!