2016-05-21 14 views
2

Die Art, wie ich RocksDB verwenden möchte finde ich ungewöhnlich. Ich möchte es verwenden, um den Speicherdruck einer Anwendung zu verringern, die eine sehr große Anzahl von Zeichenfolgen im Speicher hat. Der Grund dafür ist, dass die Anwendung irgendwann so skalieren wird, dass ansonsten Dutzende Gigabyte RAM benötigt würden, um alle Strings zu speichern. Dies ist eine nur 64-Bit-Anwendung mit Teilen in C++ geschrieben und Teile in VB.NET (ich weiß. Ich weiß.)Eine ungewöhnliche Verwendung von RocksDB

Ich wurde beauftragt, alle Saiten auf die Festplatte zu verschieben.

Ich möchte so leistungsfähig wie möglich sein. Sicher kann ich etwas wie SQLite verwenden, aber ich brauche wirklich SQL überhaupt nicht. Ich brauche nur einen Schlüssel/Wert-Speicher. Der Schlüssel kann ein 32-Bit-Int und der Wert eine Zeichenfolge sein. Typische Strings haben eine Länge von 1K bis 5K.

Die Leistungseigenschaften erforderlich sind, wie folgt:

  1. Strings werden in loser Schüttung auf die Festplatte geschrieben werden. Nachdem sie geschrieben wurden, werden sie nur selten geändert. Die meiste Zeit werden sie nur gelesen.
  2. Strings werden nur auf die Festplatte geschrieben, um sie aus dem RAM zu entfernen. Alle Saiten im RAM zur gleichen Zeit zu halten, um die Leistung zu erreichen, wird die Person besiegen. Im Idealfall kann ich angeben, wie viel RAM als Cache belegt werden soll.
  3. Haltbarkeit ist nicht wichtig. Es ist mir egal, ob der Schreib-Cache viel Zeit in Anspruch nimmt. Tatsächlich interessiert es mich nur, dass die Zeichenfolge nur dann auf den Datenträger geschrieben wird, wenn die in (2) oben angegebene Puffergröße überschritten wird. Zum Beispiel, wenn eine Milliarde Strings auf der Festplatte sind, und tausend davon im RAM behalten (als meine Puffergröße), würde ich damit einverstanden sein, dass die tausend nicht auf die Festplatte geschrieben werden, bis die eintausendundneunzigste Zeichenfolge ist zugeordnet.

ziemlich jedes System, das ich bis zu diesem Punkt sah, Memcached, redis, LevelDB, Blitzschlag, von LSM SQLite 4, lösen alle andere Probleme. Einige lösen das Problem, sicherzustellen, dass Dinge für die Haltbarkeit bestehen bleiben, so dass eine Menge Dinge passieren, um sicherzustellen, dass die Dinge crashsicher sind. Offensichtlich ist es mir in meinem Fall egal, dass die Dinge crashsicher sind. Meine Anwendung erstellt den Datenspeicher beim Start der App neu. Wenn meine App abstürzt, ist mir der Inhalt dessen, was auf der Festplatte übrig ist, egal. Andere (wie Memecached) sind da, um die Plattenleistung zu optimieren, indem sie zuerst Dinge in den Arbeitsspeicher legen. Es löst ein Problem, das fast das Gegenteil von dem Problem ist, das ich lösen muss.

Schließlich, und da dies ein 64-Bit-System ist, möchte ich, dass das System Speichermapped-Dateien zur Optimierung verwendet.

RocksDB kommt dem Werkzeug am nächsten, das ich zu verwenden glaube, aber es ist ein sehr verwirrendes und komplexes System mit einer Million Einstellungen. Außerdem ist mein spezifisches Szenario in keinem seiner veröffentlichten "Rezepte" enthalten.

Also ich bin gespannt, ob jemand vom RocksDB-Team bereit ist, mir eine Anleitung zu geben. Wenn ich das zur Arbeit bringen kann, bin ich sehr dankbar und werde sicherlich anderen online helfen, das gleiche Problem zu lösen.

+0

Ich denke, nur mit RocksDB kann Ihr Problem nicht gelöst werden, benötigen Sie eine Kombination von Memcached und RocksDB, mit RocksDB als 'Datenbank' und memcached als 'Cache'. –

Antwort

0

Ich habe nicht ganz den Teil, wo Sie sagen, Sie müssen Daten auf die Festplatte verschieben, aber brauchte keine Haltbarkeit.

Other than that, würde LevelDB eine große Auswahl:

*fast writes 
*ability to do atomic bulk insert (WriteBatch) 
*low memory footprint 
*fast key lookup (and fast iterator to read adjacent data) 

Sie nicht Plattform angegeben haben, aber es ist nativ auf Linux oder man könnte windows port (.net wrappers) auf Windows verwenden.

+0

Windows ist die Plattform. –

+0

Haltbarkeit ist, um sicherzustellen, dass Daten bei einem Systemfehler nicht verloren gehen. Ich brauche das nicht, weil das Daten sind, die sonst sowieso im RAM sind. Ich muss es in die Datenbank schreiben, um RAM zu sparen, nicht dass es mir wichtig ist, dass die Daten beim Neustarten bestehen bleiben. –

Verwandte Themen