Kermit: Mehrdimensionales ArrayList wird mit der Größe immer langsamer

Hallo,

Ich habe aktuell ein Java Problem und zwar meine mehrdimensionalen ArrayListen werden mit der Größe immer langsamer:

Hier ein Bsp.
ArrayList lTABLE = new ArrayList();
for (int i = 0; i < 22000 ; i++ ) {
ArrayList tmpList = new ArrayList();

tmpList.add( "0" );  
tmpList.add( "1" );  
tmpList.add( "2" );  
tmpList.add( "3" );  
tmpList.add( "4" );  
  
lTABLE.add( tmpList );  

}

// auslesen mit get wird immer langsamer desto großer i wird
int maxRow = lTABLE.size();
String sFile = "";
for (int i = 0; i < maxRow ; i++ ) {

if ( i==0 || (i%100)==0 ) {  
	System.err.println("################# process row:"+i+" ");  
}  
  
ArrayList alTmp 	= lTABLE.get(i);  
  
sFile = sFile+ "\""+alTmp.get(0)+"\"";  
sFile = sFile+",\""+alTmp.get(1)+"\"";  
sFile = sFile+",\""+alTmp.get(2)+"\"";  
sFile = sFile+",\""+alTmp.get(3)+"\"";  
sFile = sFile+",\""+alTmp.get(4)+"\"";  
sFile = sFile+"\n";  

}

Wenn es am Anfang 25 Sek. für 100 rows braucht sind es nach 10000 rows schon fast 2 Min.
Was kann man tun um die Schleife zu beschleunigen?

Vielen Dank und Gruß
Kermit

  1. Hallo,

    // auslesen mit get wird immer langsamer desto großer i wird
    int maxRow = lTABLE.size();
    String sFile = "";
    for (int i = 0; i < maxRow ; i++ ) {

    na das ist doch logisch.
    Nimm einfach mal an, für einen Durchlauf in deiner Schleife braucht diese 1 Sekunde.
    Bei 60 Durchläufen ist die Dauer(1 Minute) also anders als bei 1000 Durchläufen(~17 Minuten).

    Und da die Dauer von der Größe des Arrays abhängig ist wirst du das Programm nur schneller bekommen, wenn du deine Struktur(also das Array) änderst oder den Ablauf an sich.

    MfG. Christoph Ludwig

    --
    Wo die Sprache aufhört, fängt die Musik an...
    Selfcode:  sh:( fo:| ch:} rl:( br:> n4:? ie:{ mo:) va:} js:| de:> zu:) fl:( ss:) ls:&
    Go to this
    1. Es geht darum das die Schleife am Anfang für ein 100-er Block um ein vielfache weniger Zeit verbraucht.

  2. Ich fand eine etwas bessere Lösung. Sie ist zwar schneller aber nicht schnell genug.
    Und es sieht auch so aus als mit zunehmende counter langsamer wird.
    Die ersten par 100-er Blöcke waren in 3-4 Sek. durch.
    Die 5000 - 5100 brauche schon 30 Sek.

    for (Iterator iter = lTABLE.iterator(); iter.hasNext();) {

    if ( i==0 || (i%100)==0 ) {
    System.err.println("################# process row:"+i+" ");
    }

    ArrayList alTmp = (ArrayList)iter.get(i);

    sFile = sFile+ """+alTmp.get(0)+""";
    sFile = sFile+",""+alTmp.get(1)+""";
    sFile = sFile+",""+alTmp.get(2)+""";
    sFile = sFile+",""+alTmp.get(3)+""";
    sFile = sFile+",""+alTmp.get(4)+""";
    sFile = sFile+"\n";

    }

    1. mein letztes Problem war die Stringaddition:

      sFile = sFile+ """+alTmp.get(0)+""";
      sFile = sFile+",""+alTmp.get(1)+""";
      sFile = sFile+",""+alTmp.get(2)+""";
      sFile = sFile+",""+alTmp.get(3)+""";
      sFile = sFile+",""+alTmp.get(4)+""";
      sFile = sFile+"\n";

      sFile wurde mit der Zeit zu lang und java hat zu viel CPU und Speicher verbraucht

      Da ich am Ende alles in einer Datei geschrieben habe,
      habe ich den Filezugriff in der Schleife verschoben und nach alle 100 Durchgänge das Zwischenergebniss in der Datei geschrieben.

      Das ganze dauert jetzt nur noch 20-30 Sek. für alles!!