Speicherschonende Datenbank

  • C#

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von AliveDevil.

    Speicherschonende Datenbank

    Hi Leute,

    ich habe für ein kleines Projekt eine In-Memory Datenbank in C# geschrieben, mit CRUD Funktionalität und Speicherung in Dateien.
    Ob man die 90 - 100 Zeilen Code "Datenbank" nennen kann sei mal nun dahin gestellt, was mich nun interessiert, nach dem Aufbau eines In-Memory Systems, wie schaffe ich es nun NICHT die gesamte DB / Tabelle in den Speicher zu laden, und dennoch die verschiedenen Operationen durchführen zu können?

    Es ist kein akutes Problem, sondern eine Interessenfrage.

    Derzeit lassen sich die Tabellen dieser "Datenbank" einzeln in den Speicher Laden und wieder rausnehmen.
    Wäre es theoretisch möglich über nen FileStream / StreamWriter/ StreamReader wirklich nur die Elemente zu suchen und zu modifizieren, die benötigt werden?
    Wie würdet ihr an sowas herangehen?

    Wenn ich z.B. an Smartphones denke, wo sich sowas super einfügen lassen würde (ja ich hab das Privileg mit Xamarin in Visual Studio arbeiten zu dürfen :D ), kann ich nicht von mindestens 2 GB Arbeitsspeicher ausgehen. Hier sind teilweise nur 50MB zur freien verfügung.
    Warum nicht SQLite? Weil SQL nervt :P
    In-Memory bedeutet In-Memory, nichts mit Dateisystem o.Ä.
    Was du machen kannst:
    MemoryStream erzeugen, darauf einen DeflateStream machen und so gucken, dass du an die Daten kommst. Dabei sehe ich allerdings das Problem, mit überschreibenden Daten.
    Du brauchst also ersteinmal ein serialisiertes Objekt am Anfang des Streams, was dir deine Datenstruktur darstellt, dann müssen dahinter (in welcher Form auch immer) die Daten kommen. Deine Datenstruktur gibt dann also ersteinmal die Offset- und Längen-Werte der einzelnen Strukturen an.
    Für jeden Schreib- und Lesevorgang musst du dann also in der Struktur nachschauen, wo die Daten liegen und auslesen.
    Ob das jetzt schnell ist, sei mal dahingestellt.
    Beim Speichern musst du dann die Elemente aus deiner Datenbank kopieren, die sich nicht geändert haben und die neuen Werte darein schreiben.
    Mit Deflate hättest du aufjedenfall ein wenig Speicherplatz gespart (wie viel das ist, kann ich dir aber nicht sagen). Für die Speicherung der Daten auf die Festplatte, wäre dann nurnoch ein Stream.CopyTo(Stream) nötig.