# Konfiguration eines Java- Programms



## Gast (20. Jul 2008)

Morgen,

ich habe ein Java- Programm, das nach dem laden einer Konfigurations- XML- Datei startet, ich bin über diesen Umstand aber nicht ganz glücklich, das das laden der Konfig- XML- Datei bei starten schon einige Zeit dauert und wenn die Konfig- Datei einigermaßen groß ist, mir den Speicher anfüllt,

Momentan ist es so, dass sich die Konfig- XML- Datei nach dem Laden in einem Vector befindet und ich dann immer wieder mal über den Vector iterieren muss um an informationen zu gelangen,

Meine Frage wäre jetzt, ob jemand eine bessere, andere Lösung weiß, die Konfig- XML- Datei nicht zu laden und immer wieder aus der Datei zu lesen wird wahrscheinlich noch mehr zeit kosten,

Vielleicht hat ja dazu jemand eine Idee,


----------



## didjitalist (20. Jul 2008)

Was befindet sich denn im Vector? XML ist extrem geschwätzig, deshalb ist es eine gute Idee, die ganzen "überflüssigen" Auszeichnungen zu verwerfen. Etwas wie '<element value="42">' im Speicher zu halten ist natürlich extrem speicherintensiver, als sich irgendwo einen simplen integer zu merken.


----------



## MQue (20. Jul 2008)

ein Element in meiner XML- Datei schaut so aus:


```
<Pref>
  <Element id = "" name = "">
     <varID id = "" name = "">
        <State  id = "" name = "">
           <properties>
           </properties>
        </State>
         ...                //bis zu 20 <State>
     </varID>
  </Element>

// bis zu 500 <Element>
</Pref>
```


ich weiß auch nicht ob das die schnellste möglichkeit ist, das ganze einzulesen, ist es vielleicht besser, direkt aus der Datei zu lesen, ich bin halt auf der suche nach eine Möglichkeit, die "ziemlich schnell und "ziemlich" speicherschonend ist,
was ist da eurer meinung nach das beste?


----------



## Joker (20. Jul 2008)

muss es unbedingt XML sein? Was binäres (Objektserialisierung)ist, was Speicherbedarf und Geschwindigkeit angeht, sehr viel besser.


----------



## SlaterB (20. Jul 2008)

das Einlesen ist recht egal, sollte pro MB nur wenige ms dauern, sonst läuft was falsch und man kann wirklich drüber nachdenken,
die Hauptsache ist, dass es nur einmal passiert

danach wird das ganze in einer für das Programm sinnvollen Weise abgelegt,
ohne die Art der Informationen und des Zugriffs zu kennen, kann man dazu wenig sagen,
immer nützlich ist eine Map, Key -> Value, ohne eine Liste komplett durchlaufen zu müssen,

wenn du weniger als 100.000 Einzelinformationen hast, sollte das ganze jedenfalls mit normalen Verfahren keine nennenswerte Zeit dauern und keinen nennenswerten Speicher belegen,


----------



## Guest (20. Jul 2008)

meine bedenken sind, dass nach dem einlesen das Programm recht aufgeblasen ist und ich den Java Heap Space erhöhen muss und ich möchte mit so wenig speicher als irgend möglich auskommen aber das programm soll auch schnell sein, den kompromis möchte ich irgendwie finden,

PS: ich hab mir gerade das Zeitverhalten eines Arrays und einer ArrayList angesehen und da kam heraus dass bei unter 400000 Einträge kein unterschied ist, bis 3000000 ist das Array schneller, und ab 7000000 Einträgen ist die ArrayList wieder schneller, kan das sein bzw. wie ist das zu erklären?


----------



## didjitalist (20. Jul 2008)

Über was für eine Größe sprechen wir denn hier? Paar millionen Zeilen XML?


----------



## duke (20. Jul 2008)

Wie sieht es mit einer HashMap aus...

Hier kannst Du über Schlüssel direkt auf Informationen zugreifen und sie kann (auch mit anderen Collections) geschachtelt aufgebaut werden.
Ausserdem sind HashMaps sehr schnell.

Du kannst die HashMap so lange, wie sie benötigt, wird in den Cache legen.


----------



## maki (20. Jul 2008)

Wie wird denn die XML Datei eingelesen/verarbeitet?


----------



## Guest (20. Jul 2008)

die XML- Datei hat um die 40000 Zeilen und ich lese diese über den DOM- Reader ein, und diese wird dann in einem Vector gesopeichert


----------



## Gelöschtes Mitglied 5909 (20. Jul 2008)

ne config mit 40000 Zeilen :O - was schreibst du bitte?
ich glaub da würd ich ne embedded h2 db für die config nehmen ^^


----------



## duke (21. Jul 2008)

Um was für eine Art Programm handelt es sich denn und was genau muss denn konfiguriert werden ?

Evtl. lässt sich die Thematik dann besser betrachten.


----------



## Guest (21. Jul 2008)

es handelt sich um die Kofiguration einer Visualisierung, 

in der XML- Datei steht drinnen, wie die Button, Slider, Textfelder aussehen, wo sich die Datenbank befindet,, wie die TCP  oder serielle Verbindung ausschaut und so weiter,
Das heißt jetzt nicht das die XML- Datei immer 40000 Zeilen hat, aber diese kann bis zu 40000 Zeilen haben bei großen Systemen,


----------



## Atze (21. Jul 2008)

wenn du die 40000-zeilen xml-datei mit nem dom parser einliest, hast du sie ja komplett im speicher und kannst immer wieder drauf zugreigen, was schon sehr praktisch ist, aber auch speicher kostet.

vielleicht solltest du wirklich mit nem sax-parser durch das ding laufen, und die alle infos mit passenden keys in eine map legen. die kannst du dann im speicher vorhalten und immer drauf zugreifen, sollte um einiges weniger speicher verbrauchen als das gesamte dom.


----------



## Guest (21. Jul 2008)

Atze hat gesagt.:
			
		

> im speicher vorhalten




Was meinst du mit "im Speicher vorhalten"? das man eine Map hat, deren Inhalte auf die XML- Datei verweisen oder das schon alles in den Speicher eingelesen wird, 
warum ist das dann speicherschonender wenn ich alles einlese und in einer Map speichere, das wird ja dann genausoviel speicher bzw. sogar mehr Speicher brauchen, da ich ja die keys auch noch habe oder wie meinst du das


----------



## SlaterB (21. Jul 2008)

du sollst nur die Informationen speichern, die benötigt werden


<Element id = "TT1" wert = "4534897"> 
sind vielleicht 30 Zeichen mit 60 Byte mit wer weiß wieviel XML noch drumherum

String "TT1" + Integer 4534897
sind dagegen nur 6+4 = 10 Byte, vom Aufwand des wiederholten Parsens ganz zu schweigen

so in der Art


----------



## Atze (21. Jul 2008)

ja, wie slater schon sagte, nur die infos, die du brauchst. du brauchst ja nicht immer die ganze xml struktur, du kannst ja auf die tags etc oder so verzichten, sondern zB nur key="datenbank" / value="jdbc:mysql://localhost/" etc.
das ist auf jeden fall speicherschonender als das gesamte dom mit den unnätigen informationen.

und mit "im speicher vorhalten" meine ich, dass du die map in deinem programm halt global/statisch zur verfügung stellst, die bleibt ja dann so lange wie du sie brauchst


----------



## Tobias (21. Jul 2008)

Also ich benutze für sowas den Apache Digester.

mpG
Tobias


----------



## Guest (21. Jul 2008)

Tobias hat gesagt.:
			
		

> Also ich benutze für sowas den Apache Digester.
> 
> mpG
> Tobias




Noch nie davon gehört, was macht der??


----------



## Tobias (21. Jul 2008)

Der Apache Digester ist eine Abstraktionsschicht, die auf einem beliebigen SAX-Parser aufsetzt. Man kann den Digester mittels Rules konfigurieren, indem man einen XPath-Ausdruck angibt, der die entsprechende Regeln auslösen soll (also zum Beispiel "/mask/head/title" - wenn ein Title-Tag gefunden wird, welches Head und Mask als Eltern hat), sowie eine Regeldefinition, also ein Objekt, das beschreibt, was genau getan werden soll.

Auf diese Weise ist es sehr leicht (und speicherschonend) möglich Information aus einem XML-Dokument in eine eigene pure-Java-Datenstruktur zu übertragen. Als Einstieg sei das "Jakarta Commons Cookbook" empfohlen. Die Doc auf der Digester-Projektseite tut's natürlich auch.

mpG
Tobias


----------



## Atze (21. Jul 2008)

hört sich gut an, ist doch genau das, was er sucht / braucht


----------

