Frage

In unserer Anwendung verwenden wir std::map Zum Speichern (Schlüssel, Wert-) Daten und verwenden Sie die Serialisierung, um diese Daten auf der Festplatte zu speichern. Mit diesem Ansatz stellen wir fest, dass die Datenträger -E/A Leistungssgpässe ist und die Finden von Werten mit Schlüssel nicht sehr schnell ist.

Ich bin auf LevelDB gestoßen und habe darüber nachgedacht, es zu verwenden. Aber ich habe einige Fragen.

  1. Die Dokumentation von LevelDB besagt, dass es für (String-, String-) Schlüsselwertpaar erstellt wurde. Bedeutet das, dass ich für benutzerdefinierte Schlüsselwertpaare nicht verwenden kann?
  2. Es scheint der Unterschied zwischen std::map und LevelDB ist, dass LevelDB hartnäckig ist und std::map funktioniert im Speicher. Dies bedeutet dies auch, dass der Disk -E/A -Engpass für LevelDB problematischer ist.

Insbesondere kann jemand bitte erklären, ob LevelDB eine bessere Wahl sein könnte als std::map?

PS: Ich habe versucht zu verwenden hash_maps aber es scheint langsamer zu sein als std::map

War es hilfreich?

Lösung

LevelDB macht einfach etwas anderes als std :: map.

Wollen Sie wirklich sagen, dass Sie (hohe Leistung) Persistenz für Std :: Map wollen?

  • Schauen Sie sich STD :: MAP mit einem benutzerdefinierten Allocator an. Die Einträge aus einem Speicherbereich zuordnen und FSYNC verwenden, um sicherzustellen, dass die Informationen in strategischen Momenten in der Zeit auf die Festplatte kommen.

  • Kombinieren Sie das vielleicht mit Eastl (der eine schnellere Std :: Karte bietet und mit benutzerdefinierten Allocatoren gedeiht - tatsächlich haben sie keinen Standard -Allocator)

  • Schauen Sie sich das Tuning Ihres Hash_Map an (std :: uncondedd_map); Wenn Hash_Maps langsamer sind, sollten Sie sich mit (a) Loadfactor (b) Hash -Funktionstimmen ansehen

  • Last but not least: Bewerten Sie die Verwendung der Boost -Serialisierung für die binäre Serialisierung Ihrer Karte (unabhängig von Ihnen ausgewählt). Nach meiner Erfahrung ist die Steigerung der Serialisierungsleistung erstklassig.

Andere Tipps

Was Sie jetzt tun, ist Folgendes:

Angenommen, Sie haben 1000000 Datensätze in einer Datei. Sie lesen die ganz Datei in std :: map dauert ca. ~ 1000000 Vorgänge. Sie verwenden Find/Insert, um ein Element zu lokalisieren und/oder einzufügen. Dies braucht logarithmische Zeit (ca. 20 Vergleiche). Und jetzt speichern Sie die gesamte Datei erneut und übertragen all diese 1000000 -Datensätze wieder in die Datei.

Das Problem ist, dass Sie absolut nichts davon profitieren, wenn Sie STD :: MAP verwenden. STD :: MAP gibt Ihnen schnelle Suchzeiten (logarithmisch), aber die Initialisierung und Serialisierung der gesamten Karte pro Suchanlage nullte die Vorteile.

Was Sie brauchen, ist entweder das Programmieren, sodass Sie die Karte einmal beim Start laden und einmal beim Abschluss serialisieren. Oder, wenn Sie die Datenbanksemantik benötigen, entscheiden Sie sich für eine reale Datenbankimplementierung. Ich schlage vor, SQLite zu verwenden, obwohl LevelDB möglicherweise genauso gut für Sie sein könnte.

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