# Große Datenstruktur im Speicher halten



## Phorx (4. Feb 2013)

Guten Tag!

Ich habe eine ziemlich große Datenstruktur, die trotz Serialisierung noch relativ lang zum Laden braucht.
Meine Überlegung ist, ob ich dieses Objekt nicht einfach im Speicher halten kann. Verändert wird es quasi nie, nur das Programm das die Daten daraus benutzt wird ständig neu gestartet, weswegen dann immer neue deserialisiert werden muss.

Kann mir jemand sagen ob es möglich ist, daraus zwei Programm oder ähnliches zu machen, das eine hält die Datenstruktur und stellt dem Programm das diese benutzt ständig zur Verfügung, wenn benötigt, ohne neugestartet werden zu müssen?!

Vielleicht gibt es andere Möglichkeiten, auch da wäre ich sehr denkbar über Ideen und Methoden.
Bisher ist mir vor allem eingefallen, das ich es so machen könnte (wenn das technisch möglich ist) indem ich "einfach" auf die Objekte des anderen Java-Programms zugreifen könnte. Oder über ich lass das eine als Server laufen und schicke die fertig geladene Datenstruktur über TCP zum Programm das die Daten anfordert...!?

Vielen Dank für alles was ihr dazu habt!


----------



## FArt (4. Feb 2013)

Dafür gibt es Datenbanken. Eine "kleiner" Ausführung ist z.B. H2.


----------



## Phorx (4. Feb 2013)

Es geht um einen binären Entscheidungsbaum, der Tests beantwortet und je nach Antwort eine berechnete Datenmenge ausspuckt die dann wieder in einer Klasse mit verschiedenen Methoden verschachtelt ist.

Ich glaub Datenbank in dem Sinne passt da nicht so gut? Hatte ich wohl unverständlich ausgedrückt 
Oder meinst du das geht trotzdem gut mit einer Datenbank?


----------



## ARadauer (4. Feb 2013)

Das könntest du machen, das ein Programm als Server fungiert. Die Kommunikation über eine socket verbindung ist eine Lösung die auch von anderen Programmen eingesetzt wird. Wenn beide Programme auf dem selben Rechner laufen sollte es auch keine großen Performanze Probleme geben. Das kannst du ja einfach testen...


----------



## Phorx (4. Feb 2013)

Ja, werde ich machen. Ein Zugriff auf Objekte andere Java-Programme auf dem gleichen System geht also nicht?


----------



## ARadauer (4. Feb 2013)

nicht ohne middleware, schau dir mal spring remoting an


----------



## Phorx (4. Feb 2013)

Scheint nicht so gut zu sein. Die Deserialisierung dauert bei einem kleineren Beispiel nur 5 Sekunden. Das senden vom Server zum Client immerhin 10 Sekunden :-/

Hat jemand Erfahrung mit RMI ? Das hab ich noch zu dem Thema gefunden. Aber sieht nicht so richtig nach dem aus was ich gerne hätte... auf den ersten Blick.

Ok, Spring google ich dann auch mal


----------



## ARadauer (4. Feb 2013)

5 Sekunden?? wtf was serealisierst du da?


----------



## Bernd Hohmann (4. Feb 2013)

Phorx hat gesagt.:


> Hat jemand Erfahrung mit RMI ? Das hab ich noch zu dem Thema gefunden. Aber sieht nicht so richtig nach dem aus was ich gerne hätte... auf den ersten Blick.



Spring, RMI... Geht alles über Objekt(de)serialisierung.

Ein Ansatz wäre zu überlegen, den Kram I/O-Freundlich im RAM zu halten (zb. in nativen Arrays byte/int/ oä.) oder versuchen, die Daten für die Abspeicherung/Transport in native Arrays zu übersetzen um die Default-serialisierung zu umgehen.

Bernd


----------



## DrZoidberg (5. Feb 2013)

Phorx hat gesagt.:


> Scheint nicht so gut zu sein. Die Deserialisierung dauert bei einem kleineren Beispiel nur 5 Sekunden. Das senden vom Server zum Client immerhin 10 Sekunden :-/



Also auf meinem Rechner kann ich ca. 1 GigaByte pro Sekunde über eine lokale Netzwerkverbindung senden. Entweder deine Datenstruktur ist ziemlich gross oder du machst was falsch. Sende immer so viele Bytes auf einmal wie möglich mittels byte Arrays.


----------



## timbeau (5. Feb 2013)

d.h. 8GiBi/s...was habt ihr für ein Netz? Ist auf jeden Fall bei mir nicht so. Da ist die 100MBit Leitung schneller.


----------



## DrZoidberg (5. Feb 2013)

Das war eine localhost Verbindung.
Seit wann ist 100Mbit schneller als 8GBit?


----------



## timbeau (5. Feb 2013)

Ahh ok.

Doff ausgedrückt, meinte, dass unser Netzwerk ist langsamer als die 100MBit Internetleitung ist


----------



## Aiwendil (5. Feb 2013)

Wie groß ist den die serialisierte Datei, wo ist da der Flaschenhals beim deserialisieren und wie ist das ganze denn serialisiert?
Prinzipiell hast du nämlich beim Verwenden eines Servers auch immer das Problem, dass du nur serialisierte Daten schicken kannst.

Ein anderer Ansatz wäre das Programm nicht komplett zu beenden, sondern zb nur die Oberfläche und die arbeitenden Threads zu schließen. Dann könntest du einen einzigen Hintergrundthread übrig behalten, der dir deine Datenstruktur im Speicher hält und darauf wartet den Rest vom Programm neu zu starten. Wäre jetzt imho der intuitivste und am schnellsten umsetzbare Weg.


----------

