Frage

Meine app verfolgt den Zustand von etwa 1000 Objekte. Diese Objekte werden gelesen und geschrieben zu einem persistenten Speicher (serialisiert) in keiner bestimmten Reihenfolge.

Im Moment ist die App verwendet die Registrierung jeden Zustand des Objekts zu speichern. Das ist schön, weil:

  • Es ist einfach

  • Es ist sehr schnell

  • Individuelles Zustand des Objekts kann, ohne dass gelesen / geschrieben wird einige größere Einheit lesen (wie einen Ausschnitt aus einer großen XML-Datei herausziehen)

  • Es ist ein anständiger Editor (regedit), die einzelne Elemente leicht zu manipulieren erlaubt

Having said that, ich frage mich, ob es einen besseren Weg gibt. SQLite scheint wie eine Möglichkeit, aber Sie haben nicht das gleiche Maß an mehreren Lese- / Multiple-Schreiber, die Sie mit der Registrierung erhalten, und keine einfache Möglichkeit, vorhandene Einträge zu bearbeiten.

Jede bessere Vorschläge? Ein Bündel von flachen Dateien?

War es hilfreich?

Lösung

Wenn Sie mit SQLite experimentieren Sie beginnen, sollten Sie wissen, dass „out of the box“ es nicht so schnell erscheinen mag, wie Sie möchten, aber es kann schnell Tipps, indem einige etablierte Optimierung zu viel schneller vorgenommen werden:

SQLite Optimierung

In Abhängigkeit von der Größe der Daten und die Menge an RAM zur Verfügung, eine der besten Performance-Gewinne treten durch SQLite Setzen eine All-in-Memory-Datenbank zu verwenden, anstatt auf der Festplatte geschrieben werden.

In-Memory-Datenbanken, NULL als Dateiname Argument übergeben sqlite3_open und stellen Sie sicher, dass TEMP_STORE definiert ist, in geeigneter Weise

Auf der anderen Seite , wenn Sie SQLite sagen, die Festplatte zu verwenden, dann werden Sie einen ähnlichen Nutzen für Ihre aktuelle Nutzung von RegEdit erhalten die Programmdaten zu manipulieren „on the fly“.

Die Art und Weisen Sie Ihre aktuelle RegEdit Technik mit SQLite simulieren könnten, wäre das SQLite-Befehlszeilentool zur On-Disk-Datenbank zu verbinden, zu verwenden. Sie können UPDATE-Anweisungen auf den SQL-Daten aus der Befehlszeile, während des Hauptprogramm läuft (und / oder während er pausieren im Pause-Modus) ausgeführt werden.

Andere Tipps

Wenn das, was du mit ‚Multiple-Leser / multiple-writer‘ bedeuten, dass Sie eine Menge Threads halten gleichzeitig an den Speicher zu schreiben, SQLite ist THREAD (Sie transparent gleichzeitige SELECTs und gleichzeitiges Schreiben gehandhabt haben kann). Siehe die [FAQ [1]] und grep für 'THREAD'

[1]: http://www.sqlite.org/faq.html/ FAQ

Ich bezweifle, jeder vernünftige Mensch in diesen Tagen diesen Weg gehen würde, aber einige von dem, was Sie beschreiben, mit Fenster des Structured / Compound Lagerung . Ich dies nur erwähnen, da Sie fragen über Fenster -. Und das ist / war ein offizieller Windows-Weg, dies zu tun

Dies ist, wie DOC-Dateien wurden zusammen (aber nicht das neue DOCX-Format). Von MSDN wird es wirklich kompliziert erscheinen, aber ich habe es benutzt, es ist nicht die worst API in Win32.

  • ist nicht einfach
  • es ist schnell, ich würde erraten es ist schneller als die Registrierung.
  • Zustand des Einzelobjekts kann, ohne gelesen / geschrieben wird einige größere Einheit zu lesen.
  • .
  • Es gibt keinen anständigen Editor, aber es einige echten grundlegenden Dinge sind (VC ++ 6.0 hatte den „DocFile-Viewer“ unter Extras (ja, das ist, was das Ding tut) ich ein gefunden paar mehr online.
  • Sie erhalten eine Datei statt Registrierungsschlüssel.
  • Sie gewinnen einige der alten Schule Windows-Entwickler-Aussenseiter-cred.

Andere zufällige Gedanken: Ich denke, dass XML die Art und Weise ist (trotz der Random Access Ausgabe) zu gehen. Heck, können INI-Dateien arbeiten. Die Registrierung gibt Ihnen sehr feinkörnig Sicherheit, wenn Sie es brauchen - die Leute scheinen zu vergessen, wenn der Anspruch mit Dateien besser sind. Eine eingebettete DB scheint übertrieben , wenn Ich bin zu verstehen, was du tust.

Müssen Sie die Objekte auf jedem Änderungsereignis anhalten oder einfach nur im Speicher und speichern beim Herunterfahren? Wenn ja, sie einfach laden und serialisiert sie am Ende, Ihre App läuft für eine lange Zeit unter der Annahme (und Sie nicht, diesen Zustand mit einem anderen Programm teilen), dann im Speicher wird ein Gewinner sein.

Wenn Sie noch feste Größe Strukturen bekommen dann könnte man erwägen nur eine Memory-Mapped-Datei und weisen Speicher aus, dass?

Wenn das einzige, was Sie tun, ist serialize / deserialize einzelne Objekte (keine Phantasie Abfragen), dann eine btree Datenbank verwenden, zum Beispiel: Berkeley DB . Es ist sehr schnell auf die Speicherung und Datenblöcke durch Schlüssel Abrufen (ich nehme an, Ihre Objekte eine ID, die als Schlüssel verwendet werden kann) und den Zugriff durch mehrere Prozesse unterstützt wird.

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