2016-03-23 13 views
2

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?

Antwort

1

Verwenden Sie einfach MDB_NOSYNC und rufen Sie niemals mdb_env_sync() selbst auf. Sie könnten auch MDB_WRITEMAP zusätzlich verwenden. Das Betriebssystem wird schließlich weiterhin schmutzige Seiten auf die Festplatte schreiben; Sie können mit/proc/sys/vm/dirty_ratio usw. spielen, um dieses Verhalten zu kontrollieren.

+0

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. –

+0

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

+0

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. –

0

Von diesem Beitrag: https://lonesysadmin.net/2013/12/22/better-linux-disk-caching-performance-vm-dirty_ratio/

vm.dirty_ratio ist die absolute maximale Menge an Systemspeicher, die mit schmutzigen Seiten vor allem gefüllt werden können, müssen auf dem Datenträger erhalten. Wenn das System an diesen Punkt gelangt, werden alle neuen I/O Blöcke bis schmutzige Seiten auf die Festplatte geschrieben.

Wenn das Dirty Ratio zu klein ist, werden häufig synchrone Festplattenschreibvorgänge angezeigt.

Verwandte Themen