7

Ich muss eine C++ - Anwendung schreiben, die große Datenmengen liest und schreibt (mehr als das verfügbare RAM), aber immer in einer sequenziellen Weise.Auf der Suche nach einem einfach zu verwendenden eingebetteten Schlüssel-Wert-Speicher für C++

Um die Daten in einem zukunftssicheren und einfach zu dokumentierenden Weg zu halten, verwende ich Protocol Buffer. Protokollpuffer verarbeitet jedoch keine großen Datenmengen.

Meine vorherige Lösung bestand darin, eine Datei pro Dateneinheit zu erstellen (und sie alle in einem Verzeichnis zu speichern), aber dies scheint nicht besonders skalierbar zu sein.

Diesmal möchte ich versuchen, eine eingebettete Datenbank zu verwenden. Um die gleiche Funktionalität zu haben, muss ich nur Schlüssel-> Werte-Assoziationen speichern (sqlite scheint also ein Overkill zu sein). Die Werte werden die binäre Serialisierungsausgabe vom Protokollpuffer sein.

Ich erwarte, dass die Datenbank das Problem "was im Speicher zu halten, was auf Festplatte asp", das Problem "wie eine große Menge an Daten auf der Festplatte speichern" und im Idealfall meine sequenzielle Lese optimieren Muster (indem vorher die nächsten Einträge gelesen werden).

Auf der Suche nach Alternativen war ich von dem Mangel an Alternativen überrascht. Ich möchte die Datenbank nicht in einem separaten Prozess aufbewahren, da ich diese Trennung nicht benötige (dies schließt redis aus).

Die einzige Option, die ich fand, war Berkeley DB, aber es hat ein unangenehm niedriges Niveau C api. Dann war die beste Option, die ich fand, stldb4 über Berkeley DB. Die API scheint recht nett zu sein und passt zu meinen Bedürfnissen.

Allerdings bin ich besorgt. stldb4 scheint ein merkwürdiges (es hat Abhängigkeiten von libferris Zeug), unbewältigte Lösung (letzte Version vor einem Jahr), für ein Problem hätte ich allerdings ziemlich häufig sein.

Hat einer von Ihnen einen besseren Vorschlag, wie Sie dieses Problem lösen können?

Vielen Dank für Ihre Antworten.

Antwort

5

Ich denke, ich habe die Antwort auf mein Problem gefunden.

I nicht bemerkt, dass Berkeley DB zwei APIs für C liefert ++:

Diese STL-API stellt STL kompatible Vektoren und Karten Abstraktionen, die direkten Zugriff auf die Datenbank gewähren. Dies macht value = data_container[key] möglich.

Dies scheint die beste Lösung für mich zu sein; Berkeley DB STL API direkt zusammen Protokollpuffer verwenden.

1

BerkleyDB scheint Ihre Bedürfnisse zu erfüllen. Sicher, seine API ist ein bisschen umständlich, aber wenn Sie lieber eine nette API bekommen, könnte SQLite die bessere Lösung sein, obwohl ich denke, dass die Leistung nicht so gut ist.

Verwandte Themen