Große Daten ins Vector füllen

Sebastian29

Erfahrenes Mitglied
Hi an alle!

Ich als Client bekomme vom Server ein Datenpaket mit einer Größe von 136.213 bytes zurück und fülle die einzelnen Daten vom Datenpaket ins Vector hinzu. Bei dieser Größe des Datenpaketes entspricht ungefähr 543 Zeilen x 43 Spalten für die JTable. Ich gebe ja nach dem Füllen des Vector auch der JTable weiter, um die Daten in der Tabelle anzuzeigen.

Das Problem ist nur, dass das Füllen des Vectors ziemlich lange dauert. Der Grund liegt daran, dass ich im ganzen Datenpaket bestimmte Größe per For-Schleife ausschneide und damit nochmal per For-Schleife (pro Zeile) dann ins Vector füllen, z.B.:

Unter der Lupe im Datenpaket:

Für die 1. Zeile
Die ersten 4 bytes --> Nummer[4] ---> Ins Vector setValueAt( 0, ... )
Die zweiten 20 bytes --> Name[20] ---> Ins Vector setValueAt( 0, ... )
Die dritten 20 bytes --> Vorname[20] ---> Ins Vector setValueAt( 0, ... )
Die vierten 30 bytes --> Strasse[30] ---> Ins Vector setValueAt( 0, ... )
usw.......

Für die 2. Zeile
Die ersten 4 bytes nach der Gesamtlänge der 1. Zeile --> Nummer[4] ---> Ins Vector setValueAt( 1, ... )
Die zweiten 20 bytes nach der Gesamtlänge der 1. Zeile --> Name[20] ---> Ins Vector setValueAt( 1, ... )
Die dritten 20 bytes nach der Gesamtlänge der 1. Zeile --> Vorname[20] ---> Ins Vector setValueAt( 1, ... )
Die vierten 30 bytes nach der Gesamtlänge der 1. Zeile --> Strasse[30] ---> Ins Vector setValueAt( 1, ... )
usw.......

Gibt es eine andere Möglichkeit, das Füllen schneller bearbeiten zu können?

Gruß
Sebastian29
 
Hallo Sebastian (du bist scheinbar der aus Spotlight)

>> Ich als Client bekomme vom Server ein Datenpaket mit einer Größe von 136.213 bytes
>> zurück und fülle die einzelnen Daten vom Datenpaket ins Vector hinzu. Bei dieser Größe
>> des Datenpaketes entspricht ungefähr 543 Zeilen x 43 Spalten für die JTable. Ich gebe ja
>> nach dem Füllen des Vector auch der JTable weiter, um die Daten in der Tabelle
>> anzuzeigen.

>> Das Problem ist nur, dass das Füllen des Vectors ziemlich lange dauert. Der Grund liegt
>> daran, dass ich im ganzen Datenpaket bestimmte Größe per For-Schleife ausschneide
>> und damit nochmal per For-Schleife (pro Zeile) dann ins Vector füllen, z.B.:

Wie sieht denn dein DatenModel aus? Beschreibe doch mal die Aufgabenstellung genauer, wahrscheinlich muss du am Design was ändern.

Gruss SHK
 
Hallo,

wenn du nicht mit mehreren Threads auf einmal auf diesen Vector zugreifst, würde ich dir empfehlen eine ArrayList zu nutzen. Die ist wesentlich schneller.

Du könntest auch mal Code posten, dann sieht man mal was du machst und dann könnte man dir eventuell noch ein paar Tipps geben.

MFG

Sascha
 
Hi SHK und Sascha Schirra

Ich benutze damit nur in einem einzigen Thread!

Also, ich habe eine Klasse, die von AbstractTableModel abgeleitet wird, mit Vector aufgebaut und du meinst, in der Klasse mit ArrayList oder LinkedList geht das viel schneller?

Finanzbuchhaltung_Listen.java
Code:
public class Finanzbuchhaltung_Listen extends AbstractTableModel implements Column {

	private static final long serialVersionUID = 1L;
	
	public Vector m_FinanzbuchhaltungVector;
	
	public String strColumnName = "";
	
	public Finanzbuchhaltung_Listen() {
		m_FinanzbuchhaltungVector = new Vector();
	}
	
	//Liefert die Breite der Tabelle ( Breite = Alle Spalten )
	public int getColumnCount() {
		return m_columnsFinanzbuchhaltung.length;
	}

	//Liefert die Anzahl der Elemente in der Liste
	public int getRowCount() {
		return m_FinanzbuchhaltungVector == null ? 0 : m_FinanzbuchhaltungVector.size();
	}
	
	public int getColumn( int c ) 
	{
		return m_columnsFinanzbuchhaltung[ c].m_width;
	}
	
	public String getColumnName( int c ) 
	{
		return m_columnsFinanzbuchhaltung[ c].m_title;
	}
	
	public void setColumnName( String name ) {
		this.strColumnName = name;
	}
	
	public Class getColumnClass(int c) {
		return m_columnsFinanzbuchhaltung[ c].m_class;
    }
	
	public boolean isCellEditable(int nRow, int nCol ) 
	{
		return false;
	}
	
	//Liefert einen Wert für die Zelle bei ColIndex und RowIndex
	public Object getValueAt(int nRow, int nCol) {
		
		if( nRow < 0 || nRow > getRowCount() )
			return null;

		Finanzbuchhaltung_ListenData row = (Finanzbuchhaltung_ListenData) m_FinanzbuchhaltungVector.elementAt(nRow);

		switch( nCol ) {
			case COL_FINANZ_POS:
				try {
					return new Integer( row.m_Position );
				} 
				catch (NumberFormatException e) 
				{
					return new Integer( 0 );
				}
			case COL_FINANZ_KONTONR:
				try {
					return new Integer( row.m_KontoNr );
				} 
				catch (NumberFormatException e) 
				{
					return new Integer( 0 );
				}

                        usw. bis zu 42. Spalten
		}

		return null;
	}
	
	//Setzt einen Wert in eine Zelle.
	public void setValueAt( Object value, int nRow, int nCol ) {
				
		if( nRow < 0 || nRow > getRowCount() ) {
			return;
		}
		
		Finanzbuchhaltung_ListenData row = new Finanzbuchhaltung_ListenData();
		
		try {
			row = ( Finanzbuchhaltung_ListenData ) m_FinanzbuchhaltungVector.elementAt( nRow );
		}
		catch( Exception e ) {
			System.out.println( e.getMessage() );
		}
		
		String svalue = null;
		
		try 
		{
			svalue = ( value.equals( null ) ) ? "" : value.toString();
		} 
		catch (Exception e1) {
			System.out.print( e1.getMessage() );
		}

	        // Insgesamt 42 Spalten 
		switch ( nCol ) {
			case COL_FINANZ_POS:
				try {
					row.m_Position = new Integer( svalue ).intValue();
				} catch (NumberFormatException e) {}
				break;
			case COL_FINANZ_KONTONR:
				if( !svalue .equals("") )
				{
					try {
						row.m_KontoNr = new Integer( svalue ).intValue();
					} catch (NumberFormatException e) {}
				}
				else row.m_KontoNr = 0;
				break;

                        usw. bis zu 42. Spalten
		}
	}
	
	//Elemente in das Vektor einfügen
	public void insert( int nRow ) {
		
		if( nRow < 0 ) {
			nRow = 0;
		}
			
		if( nRow > m_FinanzbuchhaltungVector.size() )
			nRow = m_FinanzbuchhaltungVector.size();
			
		m_FinanzbuchhaltungVector.insertElementAt( new Finanzbuchhaltung_ListenData(), nRow );
	}

	// Einzelne Elemente im Vector löschen
	public boolean delete( int nRow ) {
		
		if( nRow < 0 || nRow >= m_FinanzbuchhaltungVector.size() )
			return false;
		
		m_FinanzbuchhaltungVector.remove( nRow );
		
		return true;
		
	}
		
	// Alle Elemente im Vector löschen
	public boolean deleteAll() {
		m_FinanzbuchhaltungVector.clear();
		return true;
	}

}

Finanzbuchhaltung_ListenData.java

Code:
public class Finanzbuchhaltung_ListenData {

	public int m_Position;
	public int m_KontoNr;
        usw. bis zu 42. Variablen
	
	public Finanzbuchhaltung_ListenData() 
	{
		m_Position 			= 0;
		m_KontoNr 			= 0;
                usw. bis zu 42. Variablen
	}

	public Finanzbuchhaltung_ListenData( 
			int position, int kontonr, usw. )
	{
		m_Position 			= position;
		m_KontoNr 			= kontonr;
                usw. bis zu 42. Variablen
	}

}
 
Zuletzt bearbeitet:
Hallo Sebastian,

da ist ja garnichts raus zu erkennen! Da brauch man aber vielmehr Infos...

Ich vermute Designfehler! Solltest du noch mal mit eurem Software-Architekten besprechen, der sich das Design überlegt hat

Gruss SHK
 
Hi an Euch :-)
Also ich denke, mir vorstellen zu können warum Du ein Performanceproblem bekommst ...
Kann es sein, dass Du die Daten nachdem Du Dein Panel mit dem JTable aufgebaut hast, in Dein Model stellst?

Wenn dem So ist, empfehle ich die Daten in Dein Model zu stellen bevor Du es an den JTable assoziierst, denn dann wird der JTable nicht immer versucht sein sein Bild zu aktualisieren. Denn jedes setValue im TModel löst einen Event im JTable aus, also dieses einfach unterbinden, wie beschrieben, und es sollte schneller gehen.

Viel Glück

Takidoso
 
Zurück