S: Passenden "Container" for ByteBUffer Pool

Status
Nicht offen für weitere Antworten.
T

tuxedo

Gast
Hallo zusammen,

um mein SIMON etwas performanter zu machen, möchte ich die ByteBuffer die ich ständig benutze/neu anlege cachen.

Und jetzt suche ich den passenden "Container" für meine ByteBuffer.

Was ich mit meinem Pool realisieren will:

Er soll eine fixe Anzahl von ByteBuffer Objekten bevorraten. Die Kapazität der ByteBuffer ist dabei nicht festgelegt, d.h. es dürfen mehrere Elemente mit selber Kapazität in Pool vorhanden sein. Aber ebenso gut können es auch lauter unterschiedliche Größen sein.

Ist der Pool voll und soll ein neuer ByteBuffer hinzugefügt werden, soll der älteste aus dem Pool entfernt werden um für den neuen Platz zu machen.

Im Prinzip bräuchte ich eine "LinkedList" die ein Key-Value-Paar verkraftet, wobei der key mehrfach vorkommen darf. Der Key wäre dann die Größe des jeweiligen ByteBuffers, und value dann der ByteBuffer selbst.

Am besten sollte sich die Liste noch nach dem ersten vorkommen eines Keys (aus einer bestimmten Richtung eben) fragen lassen.


- Nach was muss ich suchen wenn es sowas schon gibt?
- Wenn's sowas noch nicht gibt: Was würde sich zu so einer Liste am besten kombinieren lassen?

Das ganze sollte nach Möglichkeit recht performant sein und intern nicht ne Menge Overhead erzeugen.

Any ideas?

- Alex
 
T

tuxedo

Gast
Okay,mit kam grad eben selbst ne Idee, allerdings gibts da noch einen Haken:

Ich nehme ne HashMap als Basis. Als key trage ich die Größe des ByteBUffers ein. Damit es mehrere ByteBuffer mit der gleichen größe geben kann, ist "value" der HashMap eine ArrayList. Damit wird's prinzipiell gehen.

Aber wie komme ich jetzt an den ältesten ByteBuffer in diesem Konstrukt (brauch ich um den ältesten Eintrag im Pool zu entfernen wenn er droht überzulaufen)??

- Alex
 

ms

Top Contributor
Du könntest parallel zu der HashMap eine Queue verwenden.
Beides, die HashMap und die Queue in einer Klasse kapseln und du hast deinen ByteBufferPoolStack.

ms
 
T

tuxedo

Gast
Habs bis jetzt so gelöst:

Eine HashMap: Key=Größe des ByteBuffers, Value=ArrayList mit den ByteBuffers in der größe gemäß des "Key".

Parallel dazu hab ich eine LinkedList in der ich mir merke, welche Buffergrößen ich in den Pool gegeben habe. Damit weiß ich dann immer, welche Größe ich kürzlich eingefügt habe, und welche ich seit längerem nicht mehr benutze. Anhand dieser Liste sehe ich auch, wieviele ByteBuffer ich im Pool drin hab. Ist die Liste beim einfügen eines neuen BUffers schon "maxSize" groß, so fliegt eine Instanz des Buffers mit der am längsten nicht mehr benutzten Größe aus der ArrayList in der Map. Ist die Arraylist dann auch noch leer, fliegt die ArrayList auch noch raus.

Im Test funktioniert das schon prima. Aber irgendwo hab ich noch den Wurm drin, weil in meiner Anwendung krieg ich hier und da immer mal wieder einen Buffer nicht richtig gefüllt, und das obwohl ich immer brav clear() drauf ausführe.

Na mal schauen.

Die Idee mit der SoftReference ist vermutlich nicht schlecht. Nur will ich nicht die ArrayLists in der Map weg haben, sondern einzelne Einträge in der List. Und da auch nur die, die ich seit längerem nicht gebraucht habe. Mal sehen ob ich da noch was drehen kann..

- Alex
 

Marco13

Top Contributor
Hm :? Solche Daten parallel zu halten ... Fändest du es nich günstiger, dir eine Klasse "BufferCache" zu schreiben, die das Verhalten durch wenige, klar spezifizierte Methoden anbietet? Die kannst du dann entweder so implementieren, dass sie eine HashMap mit ArrayLists<ByteBuffer> und eine LinkedList enthält, oder ... (was IMHO erstmal einfacher erscheint) ... eine LinkedHashMap (die ja schon eine Mischung aus HashMap und LinkedList IST) und ArrayLists<ByteBuffer> oder (optional!) ArrayLists<SoftReference<ByteBuffer>> .... !?

Der Bug.... Hm ... "clear()" bewirkt AUCH das gleiche wie ein "rewind()"?! (Letzteres vergess' ich gerne, und dann füllt/liest er halt nicht richtig.... fiel mir nur als erstes ein....)
 
T

tuxedo

Gast
Der Bug war ein anderer. Sollte eben nicht mehrfach versuchen einen BUffer zurück in den Cache zu schieben.

Hab die Klasse jetzt fertig (für mich mit nur 2 Methoden - eine für get und eine für putBack - abstrakt genug). Aber die gewünschte mehr-performance kam dabei nicht raus. Hab nochmal mit meinem Profiler reingeschaut: In der Tat ist nicht das erzeugen der ByteBuffer das Nadelöhr. Ist wieder (oder immer noch) die serialisierung: readObject() und writeObject() auf den Object*Streams dauert so lange.

Wenn ich doch bloß dahinterkommen würde warum das bei RMI nicht so lange dauert (und soweit ich das gesehen hab cached der Object*Stream bei RMI auch nix, der wird jedesmal neu erzeugt).

Naja, soweit mal danke für die Tipps und Hilfe.

- Alex
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J einen passenden Klassennamen finden... Allgemeine Java-Themen 3
MarekLanger Filepath in Log4j2 in Docker Container Allgemeine Java-Themen 12
B Thread.sleep() in EJB Container wie lösen? Allgemeine Java-Themen 11
J Gebautes Jar per Maven in einen Docker Container kopieren Allgemeine Java-Themen 0
HarleyDavidson Best Practice Suche "Container" für Modulapplikationen Allgemeine Java-Themen 0
D Eigene/r Collection/Container Allgemeine Java-Themen 3
L Collections Schnellster Container für 4Byte vergleiche Allgemeine Java-Themen 13
S Suche Dependency Injection Container Allgemeine Java-Themen 6
A Container für tochterklassen? Allgemeine Java-Themen 4
J J2EE Server für EJB Container Allgemeine Java-Themen 8
D Frames und Container Allgemeine Java-Themen 16
G Button-Array überschreiben und dem Container zufügen? Allgemeine Java-Themen 2
E Container-Pack-Algorithmus Allgemeine Java-Themen 4
S Suche schnellen Container Typ Queue Allgemeine Java-Themen 7
P adding a window to a container Allgemeine Java-Themen 3
D asynchrone "Container" Allgemeine Java-Themen 5
M Container aktualisieren. Nur wie? Allgemeine Java-Themen 3
D ByteBuffer getInt NullpointerException Allgemeine Java-Themen 4
A ByteBuffer.get(byte[] dst,int offset,int length) Allgemeine Java-Themen 2
Luk10 Fragen zum ByteBuffer (lwjgl - icons) Allgemeine Java-Themen 2
K ByteBuffer verschlüsseln Allgemeine Java-Themen 14
G ByteBuffer -> String und String -> ByteBuffer Allgemeine Java-Themen 2
A IntBuffer zurück zu ByteBuffer Allgemeine Java-Themen 1
T ByteBuffer Allgemeine Java-Themen 5
thE_29 ByteBuffer -- wie funktioniert der? Allgemeine Java-Themen 7
N ByteBuffer-Problem Allgemeine Java-Themen 17

Ähnliche Java Themen

Neue Themen


Oben