Wie kann ich die Speichernutzung von std :: map schätzen?
Zum Beispiel habe ich eine std::map mit bekannten sizeof(A) sizeof(B), während die Karte hat N Einträge drin. Wie schätzen Sie die Speichernutzung?
Ich würde sagen, es ist so etwas wie
(sizeof(A) + sizeof(B)) * N * factor
Aber was ist der Faktor? Verschiedene Formel vielleicht?
Vielleicht ist es einfacher zu Fragen, für die Obere Grenze?
InformationsquelleAutor der Frage Drakosha | 2009-04-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Schätzung wäre näher zu
Es ist ein overhead für jedes element, das Sie hinzufügen, und es gibt auch einen festen overhead für die Aufrechterhaltung der Daten-Struktur, für die Daten Struktur Speicherung der Karte. Dies ist in der Regel ein binärer Baum, wie ein Rot-Schwarz-Baum. Zum Beispiel, in den GCC-C++ STL-Implementierung
ELEMENT_OVERHEAD
wäresizeof(_Rb_tree_node_base)
undCONTAINER_OVERHEAD
wäresizeof(_Rb_tree)
. Auf dem Bild oben sollte man auch hinzufügen, der overhead der memory-management-Strukturen verwendet für die Speicherung der Karte, die Elemente.Es ist wahrscheinlich einfacher zu erreichen eine Schätzung durch Messen der code-Speicherverbrauch für verschiedene große Sammlungen.
InformationsquelleAutor der Antwort Diomidis Spinellis
Könnten Sie MemTrackvon Curtis Bartley. Es ist ein Speicher-Zuweisung ersetzt die Standard ein und kann Speichernutzung verfolgen nach unten, um die Art der Zuweisung.
Ein Beispiel der Ausgabe:
InformationsquelleAutor der Antwort Xavier Nodet
Wenn Sie wirklich wollen, zu wissen, die Laufzeit, Speicherbedarf, verwenden Sie eine benutzerdefinierte Zuweisung und übergeben Sie es bei der Erstellung der Karte. Siehe Josuttis' Buch und diese Seite sein (für eine individuelle Zuweisung).
Die Obere Grenze hängt von der genauen Umsetzung (z.B. die Besondere Variante des balanced tree). Vielleicht können Sie uns sagen, warum Sie benötigen diese Informationen, damit wir besser helfen können?
InformationsquelleAutor der Antwort dirkgently
Vor kurzem musste ich diese Frage zu beantworten, für mich selbst, und schrieb nur ein kleines benchmark-Programm mit std::map die ich zusammengestellt unter MSVC 2012 im 64-bit Modus.
Einer Karte mit 150 Millionen Knoten getränkt bis ~ 15 GB, was bedeutet, die 8-byte-L, 8-byte-R, 8-byte-int-Taste, und 8-byte-datum in Höhe von 32 bytes, getränkt über 2/3rds der Karte - Speicher für den internen Knoten, verlassen 1/3 der Blätter.
Persönlich, ich fand das überraschend schlechte Speicher-Effizienz, aber es ist was es ist.
Hoffe, das macht für eine praktische Regel-of-Daumen.
PS: Der Aufwand für eine std::map ist, die von einem einzelnen Knoten, der Größe AFAICT.
InformationsquelleAutor der Antwort user2548100
Die Formel ist mehr wie:
wo Faktor ist die pro Eintrag overhead. C++ - Karten werden normalerweise implementiert, als rot-schwarz-Bäume. Diese sind binäre Bäume, so gibt es mindestens zwei Zeiger für den linken/rechten Knoten. Es wird auch eine Umsetzung Zeug - wahrscheinlich ein Eltern-Zeiger und eine "Farbe" - Anzeige, also Faktor kann so etwas wie
Allerdings ist dies alles sehr implementierungsabhängig - um herauszufinden, für sicher, Sie wirklich brauchen, zu prüfen, den code für die eigene Bibliothek Umsetzung.
InformationsquelleAutor der Antwort
Die Größe der Karte hängt wirklich davon ab, die Umsetzung der Karte. Sie können unterschiedliche Größen auf verschiedenen Compilern/Plattformen, je nachdem, welche STL-Implementierung Sie stellen.
Warum brauchen Sie diese Größe?
InformationsquelleAutor der Antwort Cătălin Pitiș