Frage

Wenn ich eine habe unveränderlich Karte, die ich erwarten könnte (über einen sehr kurzen Zeitraum - wie ein paar Sekunden), um hinzuzufügen/zu entfernen Hunderttausende von Gegenständen von, ist der Standard HashMap eine schlechte Idee? Nehmen wir an, ich möchte in <10 Sekunden 1 GB Daten über die Karte übertragen, so dass die maximale Größe der Karte zu einem Zeitpunkt nur 256 MB beträgt.

Ich habe den Eindruck, dass die Karte eine Art "Geschichte" hat, aber ich werde es tun stets Zugreifen Actor Dies wird nur aus den Reaktionen aktualisiert/zugegriffen.

Grundsätzlich vermute ich, dass diese Datenstruktur (teilweise) schuld sein kann Für Probleme, die ich in JVMs sehe, die aus dem Gedächtnis gehen beim Lesen in großen Datenmengen in kurzer Zeit.

Wäre ich mit einer anderen Kartenimplementierung besser dran und wenn ja, was ist das?

War es hilfreich?

Lösung

Autsch. Warum müssen Sie eine unveränderliche Karte verwenden? Schlechter Müllsammler! Unveränderliche Karten erfordern im Allgemeinen (log n) neue Objekte pro Operation zusätzlich zur (log n) Zeit, oder sie wickeln wirklich nur veränderliche Hash -Karten und Schichtwechsel oben (was die Dinge verlangsamt und die Anzahl der Objektkreationen erhöhen kann).

Die Unveränderlichkeit ist großartig, aber das scheint mir nicht wie die Zeit, es zu benutzen. Wenn ich du wäre, würde ich mich dabei halten scala.collection.mutable.HashMap. Wenn Sie einen gleichzeitigen Zugriff benötigen, wickeln Sie stattdessen die Java util.concurrent ein.

Vielleicht möchten Sie auch die Größe der jungen Generation im JVM erhöhen: -Xmn1G oder mehr (vorausgesetzt, Sie laufen mit -Xmx3G). Verwenden Sie auch den Durchsatz (parallel) Müllsammler.

Andere Tipps

Das wäre schrecklich. Sie sagen, Sie möchten immer auf die zuletzt aktualisierte Tabelle zugreifen, das bedeutet, dass Sie nur eine benötigen flüchtig Datenstruktur, es besteht keine Notwendigkeit, die Kosten für a zu bezahlen hartnäckig Datenstruktur - Es ist wie bei Handelszeit und Speicher, um vollständig streitige "Stilpunkte" zu gewinnen. Sie sind nicht Bauen Sie Ihr Karma, indem Sie blind anhaltende Strukturen verwenden, wenn sie nicht aufgefordert werden.

Auch ein Hashtable ist eine besonders schwierige Struktur, um es anhaltend zu machen. Mit anderen Worten, "sehr, sehr langsam" (im Grunde ist es nutzbar, wenn es sehr überlegen ist, dass es über viele schreibt - und Sie scheinen über viele Schreibvorgänge zu sprechen).

Übrigens a ConcurrentHashMap Würde in diesem Design keinen Sinn ergeben, da die Karte von einem einzelnen Schauspieler zugegriffen wird (das verstehe ich aus der Beschreibung).

Scalas sogenannte (*) unveränderliche Karte ist über die grundlegende Verwendung bis zu Scala 2.7 hinaus unterbrochen. Vertrauen Sie mir nicht, schauen Sie einfach die Anzahl der offenen Tickets dafür nach. Und die Lösung lautet nur "sie wird auf Scala 2.8 durch etwas anderes ersetzt (was es getan hat).

Wenn Sie also eine unveränderliche Karte für Scala 2.7.x wünschen, würde ich raten, sie in etwas anderem als Scala zu suchen. Oder verwenden Sie stattdessen einfach TreehasMap.

(*) Scalas unveränderliche Karte ist nicht wirklich unveränderlich. Es handelt sich intern in einer veränderlichen Datenstruktur, die viel Synchronisation erfordert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top