Adaptive Maps in Scala (oder Java) Einfügungsreihenfolge beibehalten

8

Ich würde gerne eine Kartenimplementierung mit folgenden Attributen finden und wiederverwenden:

  1. Während die Anzahl der Einträge klein ist, sagen Sie & lt; 32, zugrunde liegenden Speicher sollte in einem Array wie folgt getan werden [key0, val0, key1, val1, ...] Dieses Speicherschema vermeidet viele kleine Entry-Objekte und bietet für extrem schnelle Look-Ups (auch wenn sie sequentielle Scans sind!) An Moderne CPUs werden aufgrund des CPU-Caches nicht ungültig gemacht und es fehlt die Pointer-Indirektion in den Heap.

  2. Die Karte sollte die Reihenfolge der Einfügungen für Schlüssel / Wert-Paare beibehalten, unabhängig von der Anzahl der Einträge, die LinkedHashMap ähnlich sind

Wir arbeiten an einer In-Memory-Darstellung riesiger (Millionen von Knoten / Kanten) Graphen in Scala und eine solche Map würde uns erlauben, Knoten- / Kantenattribute sowie Kanten pro Knoten auf eine viel effizientere Weise zu speichern für 99% + von Knoten und Kanten, die wenige Attribute oder Nachbarn haben, während die chronologische Reihenfolge für Attribute und Kanten beibehalten wird.

Wenn jemand eine Scala oder Java Karte mit solchen Eigenschaften kennt, wäre ich sehr verpflichtet.

Danke

    
Alex Kravets 02.09.2010, 20:17
quelle

3 Antworten

1

Obwohl mir keine Implementierungen bekannt sind, die genau Ihren Anforderungen entsprechen, könnten Sie daran interessiert sein, Flat3Map ( Quelle ) in der Jakarta Commons Bibliothek.

Leider sind die Jakarta-Bibliotheken ziemlich veraltet (zB keine Unterstützung für Generika in der letzten stabilen Version, obwohl es vielversprechend ist, zu sehen, dass sich das im Stamm ändert) und ich bevorzuge normalerweise die Google Collections , aber es könnte sich lohnen, zu sehen, wie Apache Dinge implementiert hat .

Flat3Map behält leider nicht die Reihenfolge der Schlüssel bei, aber ich habe einen Vorschlag in Bezug auf Ihren ursprünglichen Beitrag. Anstatt die Schlüssel und Werte in einem einzigen Array wie [key0, val0, key1, val1, ...] zu speichern, empfehle ich die Verwendung von parallelen Arrays; das heißt, ein Array mit [key0, key1, ...] und ein anderes mit [val0, val1, ...] . Normalerweise bin ich kein Befürworter von parallelen Arrays, aber auf diese Weise können Sie ein Array vom Typ K, Ihrem Schlüsseltyp, und einem anderen vom Typ V, Ihrem Werttyp, haben. Auf der Java-Ebene hat dies seine eigenen Warzen, da Sie nicht die Syntax K[] keys = new K[32] ; Stattdessen müssen Sie ein wenig Typecasting verwenden .

    
ide 10.10.2010 06:14
quelle
1

Haben Sie mit Profiler gemessen, ob LinkedHashMap für Sie zu langsam ist? Vielleicht brauchst du diese neue Karte nicht - vorzeitige Optimierung ist die Wurzel allen Übels. Anyway für die Verarbeitung von Millionen oder mehr Daten in einer zweiten, sogar am besten optimierten Karte kann zu langsam sein, weil jeder Methodenaufruf in diesen Fällen auch die Leistung verringert. Dann können Sie nur Ihre Algorithmen aus Java-Sammlungen in Arrays umschreiben (d. H. Int - & gt; Object Maps).

    
iirekm 12.10.2010 10:26
quelle
0

Unter Java können Sie ein 2D-Array (Tabellenkalkulation) pflegen. Ich habe ein Programm geschrieben, das im Grunde ein 2-D-Array mit 3 Datenmengen und 3 Spalten zum Nachschlagen der Daten definiert. Die drei Farben sind testID, SubtestID und Mode. Dies erlaubt mir, im Grunde nach einem Wert nach Testid und Modus oder irgendeiner Kombination zu suchen, oder ich kann mich auch auf statische Platzierung beziehen. Die Tabelle wird beim Start in den Speicher geladen und vom Programm referenziert. Es ist unendlich erweiterbar und neue Werte können nach Bedarf hinzugefügt werden.

Wenn Sie interessiert sind, kann ich heute Abend ein Quellcode-Beispiel veröffentlichen.

Eine andere Idee könnte sein, eine Datenbank in Ihrem Programm zu pflegen. Datenbanken sind so konzipiert, dass sie große Datenmengen organisieren.

    
Adam Outler 06.10.2010 18:59
quelle

Tags und Links