2015-05-27 12 views
6

Gegeben eine Struktur MyData, von der viele Instanzen existieren (ich würde sagen, mehrere Millionen höchstens), für jede Instanz muss ich ein Mitglied speichern, das Werte für bis zu 8 Schlüssel enthalten kann . Der Schlüssel wird immer ein int entfernter 0-7 sein, und die Werte werden immer ein 3D-Punkt von floats sein (nennen wir es Point3).std :: map für kleine Sparse-Sammlungen

Bei maximaler wäre es enthalten:

Key | Value 
------------- 
0 | [x,y,z] 
1 | [x,y,z] 
2 | [x,y,z] 
3 | [x,y,z] 
4 | [x,y,z] 
5 | [x,y,z] 
6 | [x,y,z] 
7 | [x,y,z] 

in 99,9% der Fälle ist es jedoch 0 oder 1 Schlüssel-Wert-Paare enthalten, zB:

Key | Value 
------------- 
1 | [x,y,z] 

Wie kann ich den Speicher-Overhead, falls vorhanden, effizient zu bestimmen, um einen leeren oder einwertigen std::map<int, Point3> zu speichern, verglichen mit dem Speichern eines Arrays aus 8 Point3 (4 Bytes pro Float * 3 Werte * 8 Slots = 96 Bytes) und einem einzelnen BYTE mit Bits, für die Slots sinnvolle Werte enthalten?

Im Allgemeinen ist meine Frage Was ist der Speicheraufwand von einem leeren oder fast leeren std::map?

+5

Verwenden Sie Vektor und nutzen Sie das Beste aus beiden Welten. auf jeden Fall ist die lineare Suche in diesem Maßstab schneller als die Suche nach bst. wie für die leere Kartengröße: Paar Zeiger, fast leer: Implementierung abhängig. – Slava

+0

@Slava Danke. Ich verstehe, du meinst einen 'std :: vector' von' struct {int i; Punkt3 p; } ', ja? – Rotem

+0

Sie möchten wahrscheinlich in Ihre Implementierung von STL eintauchen und sehen, wie std :: map implementiert ist. Dies wird möglicherweise von einer Implementierung zur nächsten abweichen. Sie können auch selbst experimentieren und sehen, was passiert. –

Antwort

4

Der Speicheraufwand einer Karte ist nicht , die schlecht ist. Es sind typischerweise ein paar Wörter pro Knoten. Die Verwendung einer Karte wäre mit der Regel "keine vorzeitige Optimierung" definitiv in Ordnung.

Das heißt, wenn Sie optimieren, wird die Karte in der Liste der zu ersetzenden Datenstrukturen hoch sein. Aber an diesem Punkt können Sie alle verschiedenen Operationen profilieren, die Sie tatsächlich verwenden. Wie oft ändern sich die Schlüssel und/oder Werte? Das sind wichtige Informationen, die Sie vor der Optimierung wissen sollten.

[Bearbeiten] Wenn ich eine Struktur vorschlagen würde, wäre es ein Vektor von std::pair<int, Point3D>. Der Grund dafür ist, dass dies wahrscheinlich ausrichtungsfreundliche 16-Byte-Objekte ergibt. Ich würde mich nicht damit beschäftigen, die Schlüssel zu sortieren, weil das nur für die 0,1% -Knoten nützlich ist, die mehrere Schlüssel/Wert-Paare haben.

+0

Die Daten werden einmal geschrieben und mehrmals gelesen. – Rotem

+3

@Rotem: Das ist ein Argument _against_ std :: map. Karte hat eine billige Einfügung (muss nur einen Knoten hinzufügen und einige Knotenzeiger mischen). Das Einfügen in einen sortierten Vektor bedeutet im Allgemeinen das Verschieben der Hälfte der Elemente. (also O (log N) gegen O (N)). – MSalters

1

Werfen Sie einen Blick auf this Blogpost. Es gibt eine sehr gründliche Analyse der Speichernutzung verschiedener STL-Container (einschließlich std::map) und verschiedene Plattformen/Compiler werden berücksichtigt.

in den 64-Bit-STL, die (C++ 10 Visuelle) mit Visual Studio 2010 kommen:


Karte 32 Bytes für das Kartenobjekt verwendet, um sich, dann wird jede Karte Knoten 26 Bytes größer als die Größe des enthaltenen Objekts (wahrscheinlich 32 Bytes nach Berücksichtigung von Ausrichtung und Verschwendung). Die Anzahl der für eine Karte erforderlichen Karten Knoten ist 1 mehr als die Größe der Karte.

+0

Ich habe ein relevantes Zitat von diesem Link hinzugefügt. – Rotem

Verwandte Themen