Ich habe ein Projekt, das BerkelyDB als Schlüsselwertspeicher für Hunderte von Millionen kleiner Datensätze verwendet.In Speicherdatenbanken mit LMDB
Die Art und Weise, wie es verwendet wird, ist, dass alle Werte in die Datenbank eingefügt werden, und dann werden sie sowohl mit sequenziellem als auch mit wahlfreiem Zugriff iteriert, alles aus einem einzigen Thread.
Mit BerkeleyDB kann ich erstellen in-memory databases, die "nie beabsichtigt, auf der Festplatte erhalten werden". Wenn die Datenbank klein genug ist, um in den BerkeleyDB-Cache zu passen, wird sie niemals auf die Festplatte geschrieben. Wenn es größer als der Cache ist, wird eine temporäre Datei erstellt, die den Überlauf enthält. Diese Option kann die Vorgänge erheblich beschleunigen, da sie verhindert, dass meine Anwendung beim Schließen der Datenbank mehrere Gigabyte an Daten auf die Festplatte schreibt.
Ich habe festgestellt, dass die BerkeleyDB Schreibleistung zu schlecht ist, auch auf einer SSD, also würde ich gerne auf LMDB wechseln. Basierend auf der documentation, scheint es jedoch keine Option zum Erstellen einer nicht persistenten Datenbank zu geben.
Welche Konfiguration/Kombination von Optionen sollte ich verwenden, um die beste Leistung aus LMDB herauszuholen, wenn es mir überhaupt nicht um Persistenz oder gleichzeitigen Zugriff geht? d. h. um es wie eine "In-Memory-Datenbank" mit temporärem Backing-Disk-Speicher zu machen?
Ich denke, das würde immer noch alles auf die Festplatte geschrieben werden, wenn die Datenbank geschlossen ist? Bei einer vollständig im Speicher befindlichen Datenbank verlangsamt dies den gesamten Vorgang erheblich. –
Unsinn. Durch das Schließen einer Datei wird die Datei nicht gelöscht. Wenn Sie die Dateien schließen und löschen, bevor das Betriebssystem gelöscht wird, wird nichts geschrieben. – hyc
Nur aus Gründen der Vollständigkeit, Sie sind richtig für die meisten (wenn nicht alle) Situationen auf Linux. Für andere Betriebssysteme oder sogar für alle Dateisysteme ist dies jedoch nicht unbedingt der Fall. Es gibt zumindest einige Hinweise, dass 'close()' in bestimmten Situationen unter Mac OS X blockiert. Quelle: http://blog.libtorrent.org/2012/10/asynchronous-disk-io/ Wie bei all diesen Tricks , müssen Sie experimentieren, um zu sehen, ob es tatsächlich für Sie funktioniert. –