Große ArrayListen

Status
Nicht offen für weitere Antworten.

ste

Mitglied
Hallo,

ich habe folgendes Problem: In meinem Programm muss ich sehr große ArrayListen handeln. Ich habe eine ArrayList in der ca. 1 Mio. Punktobjekte mit ID und Koordinaten gespeichert werden. Zusätzlich benötige ich noch eine ArrayList mit ca. 3 Mio. Linienobjekten mit Start- und Endknoten.
Die Punkte machen keine Probleme, aber wenn ich die ArrayList mit den 3 Mio. Linien anlege, bekomme ich eine "Out of memory" Exception. (ich war eigentlich auch nicht überrascht, denn irgendwann musste das ja passieren :?)
Gibt es irgendeine Möglichkeit das ganze Platzsparender anzulegen, oder temporär auf die Festplatte auszulagern, oder vielleicht ganz was anderes?
Denn zusätzlich möchte ich aus den Informationen über die Punkte und Linien noch Dreiecke berechnen, die auch noch irgendwo zwischengespeichert werden müssen.

Kennt jemand eine Lösung mit der man so große Datenmengen behandeln kann,um sie dann auch noch mit angemessener Berechnungszeit weiter zu verarbeiten?
 

Marco13

Top Contributor
Bill Gates soll ja mal gesagt haben: "No one will need more than 640 kilobytes of memory for a personal computer.". Wie viel RAM hast du? Ein Gigabyte? oder 2 oder 4? Jedenfalls genug, um 1 Million Punkte zu Speichern (1 Objekt: ca. 24 bytes, ID: 4 bytes, 3*double-Koordinaten: 3*8 bytes, insgesamt ca. 50 bytes d.h. ca. 50 MB) Selbst wenn die 3 Millionen Linien nochmal jeweils 100 byte brauchen sollte das kein Problem sein.

Schon mit
java -Xmx1200m MeinProg
gestartet, und z.B. 1.2 GB Speicher bereitgestellt?

Trotz allem solltest du - falls möglich - die ArrayLists mit der gewünschten Größe initialisieren, also

NICHT
ArrayList a = new ArrayList();
for (int i=0; i<3000000; i++) a.add(new Line(...));

sondern
ArrayList a = new ArrayList(3000000);
for (int i=0; i<3000000; i++) a.add(new Line(...));

Sonst dauert das Einfügen viel länger, und es wird u.U. VIEL zu viel Speicher allokiert.
 

byte

Top Contributor
Oder wenn die Größe vorher nicht bekannt ist, alternativ eine LinkedList benutzen.
 

ste

Mitglied
Vielen Dank für eure Antworten.

Also, ich hab 1GB RAM. Es geht zwar noch was fürs Betriebssystem drauf, und diverse andere kleine Dinge, aber das was übrig bleibt sollte eigentlich ausreichen.

Die ArraListen habe ich natürlich vorher initialisiert, das ständige Umkopieren würde bei der Anzahl der Einträge einfach zu lange dauern.

Ich bekomme folgende Exception beim Initialisieren der 3 Mio. ArrayList für die Linien:

Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space

Irgendwie muss man das Problem doch lösen können, denn es gibt ja auch andere Programme, die große Datenmengen verarbeiten. ???:L
 

Marco13

Top Contributor
Code:
import java.util.*;

class ArrayListTest
{
    public static void main(String args[])
    {
        ArrayList a = new ArrayList(10000000);
        System.out.println("Done.");
    }
}

10 Millionen Einträge geht bei mir. Mit -Xmx1300m gehen sogar 30 Millionen (was bei 1GB aber nicht viel bringt). Kannst ja ggf. auch mal einen LinkedList testen (obwohl die sicher noch mehr Speicher braucht, als eine ArrayList).
 

kopfsalat

Bekanntes Mitglied
Beim Start der JVM kannst du den maximalen Speicherbedarf angeben, den die JVM nutzen darf. Standardmäßig ist das 64MB.
Wie Marco schon beschrieben hat kannst du das erhöhen, z.B. auf 512MB durch:

Code:
java -Xmx512m MeinProg
 

ste

Mitglied
Das mit dem Speicherplatz reservieren hat nicht geklappt. Wenn ich 1024 MB reserviere, dann fliege ich noch früher mit folgender Fehlermeldung raus: Not enough storage is available to process this command at sun.nio.ch.FileChannelImpl.map0
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Welcher Datentyp für sehr große Zahlenbereiche? Allgemeine Java-Themen 1
F Große Datenmengen effizient programmieren Allgemeine Java-Themen 51
N Das große O berechnen Allgemeine Java-Themen 2
F Best Practice Große Anzahl an Objekten speichern und lesen Allgemeine Java-Themen 19
R Große Zahlen in Worten abkürzen Allgemeine Java-Themen 10
K Große JSON-Dateien schnell und effizient verarbeiten Allgemeine Java-Themen 16
K Große Mengen an Daten speichern Allgemeine Java-Themen 9
VfL_Freak Große und seltsame Probleme nach Java-Update auf V1.8.0_91 Allgemeine Java-Themen 3
E Best Practice Verdammt große Objekte Allgemeine Java-Themen 10
P Große Datenstruktur im Speicher halten Allgemeine Java-Themen 13
M Einfluss von Caching auf die Performance (große Arrays) Allgemeine Java-Themen 24
U Große Liste von Strings mit indiziertem Zugriff Allgemeine Java-Themen 31
P Datentypen Große Datenmenge Sortiert halten Allgemeine Java-Themen 12
D große Textdatei filtern Allgemeine Java-Themen 13
M Große Datei mit Regex durchsuchen Allgemeine Java-Themen 4
R POI große Exceldatei schreiben Allgemeine Java-Themen 7
R Dateigestützte Collection für große Datenmengen Allgemeine Java-Themen 5
K Scanner - große Textfile, nur 0 ab betim. Wert Allgemeine Java-Themen 4
trash Das große Problem: .jar Archiv Allgemeine Java-Themen 19
J Große Datei einlesen und gestückelt verarbeiten Allgemeine Java-Themen 4
I Große Datei am effektivsten/performantesten auslesen und auswerten? Allgemeine Java-Themen 6
S große CSV-Dateien Importieren. Beste Lösung ?! AWS,S3,Hadoop!? Allgemeine Java-Themen 4
P große double Zahlen und modulo Allgemeine Java-Themen 8
O Große Anzahl Bilder laden Allgemeine Java-Themen 7
A Mit RegEx große Dokumente erfassen Allgemeine Java-Themen 14
X Wie verdammt große Datein öffnen? Allgemeine Java-Themen 2
G Große Datenmengen per JDBC Allgemeine Java-Themen 5
P Große Datenmenge wie speichern (HashMap? TreeMap?) Allgemeine Java-Themen 11
G Große XML-Dateien einlesen und auswerten . Allgemeine Java-Themen 2
P Performance: Ziehen ohne Zurücklegen (große Datenmenge) Allgemeine Java-Themen 10
I JNI - Große Daten übertragen Allgemeine Java-Themen 6
T Große Dateibestände löschen - Speicherproblem Allgemeine Java-Themen 20
S große Datei einlesen! Allgemeine Java-Themen 7
J Große Zahl (double) as text ausgeben? Allgemeine Java-Themen 2
S Kleines Eclipse Problem, große Wirkung Allgemeine Java-Themen 7
H Referenzen statt Objekte für große Speicherstrukturen Allgemeine Java-Themen 19
K Große Herausforderung Allgemeine Java-Themen 2
F Zu große Werte beim byteweisen Lesen mit BufferedReader.read Allgemeine Java-Themen 5
D Große Klasse - was fällt euch so ins Auge? Kritik bitte! Allgemeine Java-Themen 10
M Große Dateien laden Allgemeine Java-Themen 2
F Große Dateien schnell einlesen Allgemeine Java-Themen 14
B Einfach Elemente zweier Arraylisten kreuz und quer vergleichen, min und max Problem? Allgemeine Java-Themen 16
4 Java 2 ArrayListen Werte herauslesen/übernehmen Allgemeine Java-Themen 4
S iText Cellen mit Attributen aus ArrayListen füllen Allgemeine Java-Themen 1
E Wie Arraylisten auf bestimmte Art durchlaufen? Allgemeine Java-Themen 3
C Kombinationen von ArrayListen mit unterschiedlichen Längen Allgemeine Java-Themen 7
M 2 ArrayListen zu einer Allgemeine Java-Themen 2
B OutOfMemoryError und Arraylisten Allgemeine Java-Themen 2
F dynamische ArrayListen? Allgemeine Java-Themen 8

Ähnliche Java Themen

Neue Themen


Oben