Beste (kostenlos) Möglichkeit, Daten zu speichern? Wie wäre es Updates für das Dateisystem?

StackOverflow https://stackoverflow.com/questions/142114

  •  02-07-2019
  •  | 
  •  

Frage

Ich habe eine Idee, wie dieses Problem zu lösen, aber ich wollte wissen, ob es etwas einfacher und erweiterbar ist mein Problem.

Das Programm, das ich auf gerade arbeite hat zwei grundlegende Formen der Daten: Bilder und die Informationen mit den Bildern verknüpft. Die Informationen mit den Bildern zugeordnet wurde sowohl in den gespeicherten Feldern langsam und unvollständig in einer Jet-Datenbank extremer Einfachheit (vier Tabellen), die erwies sich als zuvor gespeichert. Wir bewegen uns auf eine neue Implementierung der Datenspeicherung. Bedenkt man die Einfachheit der Datenstrukturen, dachte ich, dass eine Datenbank war viel des Guten.

Jedes Bild wird Informationen von seinen eigenen (Capture-Parametern) hat, wird Teil einer Gruppe von Bildern sein, die miteinander verbunden sind (in der gleichen 30 Minuten Zeit genommen, sagen), und dann ein Teil einer größeren Gruppe insgesamt (aufgenommen von die selbe Person). Gerade jetzt, ich bin Speicherung Menschen in einem Wörterbuch mit einer eindeutigen Kennung. Jede Person hat dann eine Liste der verschiedenen Gruppen von Bildern, und jede Bildgruppe hat eine Liste der Bilder. Alle diese Klassen sind serializable, und ich bin nur die Serialisierung und Deserialisierung das Wörterbuch. Ziemlich einfach Sachen. Die Bilder werden separat gespeichert, so dass das Wörterbuch in der Größe nicht astronomisch werden zu lassen.

Das Problem ist: Was passiert, wenn ich neue Informationsfelder hinzufügen muß? Gibt es eine einfache Möglichkeit, diese Datenstrukturen zu Setup für mögliche künftige Änderungen zu berücksichtigen? In der Vergangenheit war die Art, wie ich dies in C behandeln würde eine serializable Struktur mit vielen leeren Bytes zu erstellen (mindestens ein k) für zukünftige Erweiterbarkeit, mit einem des Bytes in der Struktur, welche die Version. Dann, wenn das Programm die Struktur zu lesen, würde es wissen, welche Deserialisierung auf einer massiven Switch-Anweisung basierte zu verwenden (und alte Versionen neue Daten lesen können, weil irrelevante Daten nur in den Felder gehen würden, die ignoriert werden).

Gibt es eine solche Regelung gibt es in C #? Wie, wenn ich eine Klasse, die eine Gruppe von String und Int Objekten ist, und dann ein anderes String-Objekt auf die Struktur ich hinzufügen, wie kann ich deserialisieren ein Objekt von der Festplatte, und dann die Zeichenfolge, um es hinzuzufügen? Muß ich mich damit abfinden, mehrere Versionen der Datenklassen und mit einer Fabrik, die einen Deserialisierung Strom nimmt und Griffe Deserialisierung basierend auf einigen Versionsinformationen in einer Basisklasse gespeichert? Oder ist eine Klasse, wie Wörterbuch ideal für diese Art von Informationen zu speichern, da sie automatisch alle Felder auf dem Datenträger wird deserialisieren, und wenn es neue Felder hinzugefügt, kann ich nur Ausnahmen und Ersatz in leere Strings und Ints für diese Werte fangen?

Wenn ich mit dem Wörterbuch Ansatz gehen, gibt es eine Geschwindigkeit Hit mit Dateilese assoziiert / schreibt sowie Parameterabrufzeiten? Ich vermute, dass, wenn es nur in einem Klassenfelder, dann Feld Abruf Instant ist, aber in einem Wörterbuch, gibt es einige kleine Kopf mit dieser Klasse zugeordnet ist.

Danke!

War es hilfreich?

Lösung

ist mein Gehirn im Moment gebraten, also bin ich nicht sicher, ob ich für oder gegen eine Datenbank beraten können, aber wenn Sie für versionsunabhängig Serialisierung suchen, würden Sie ein Narr, nicht zumindest überprüfen in Protocol Buffers .

Hier ist eine kurze Liste von Implementierungen Ich kenne für C # / NET:.

Andere Tipps

Sqlite ist das, was Sie wollen. Es ist eine schnelle, bündig, Single-File-Datenbank, die Bindungen zu den meisten Sprachen hat.

Im Hinblick auf die Erweiterbarkeit können Sie Ihre Modelle mit Standardattributen speichern und dann eine separate Tabelle für zukünftige Änderungen für Attributerweiterungen haben.

Ein oder zwei Jahre auf der Straße, wenn der Code immer noch in Gebrauch ist, du wirst glücklich sein, dass 1) Andere Entwickler eine angepasste Code-Struktur zu erhalten, den Code nicht lernen müssen, 2) können Sie exportieren, anzeigen, ändert die Daten mit Standard-Datenbank-Tool (es gibt einen ODBC-Treiber für sQLite-Dateien und verschiedene Abfrage-Tools), und 3) Sie werden in der Lage zu einer Datenbank zu skalieren mit minimalen Änderungen am Code.

Nur ein kleines Wort der Warnung, SQLLite, Protocol Buffers, mmap et al ... alles sehr gut, aber Sie sollten jede Implementierung Prototyp und testen und stellen Sie sicher, dass Sie gehen, um nicht die gleichen perf Probleme oder andere Engpässe zu treffen.

Einfachheit nur sein kann, zu SQL (Express) (Sie im perf Gewinn überrascht sein, können) Upsizing und beheben, was auch immer von dem aktuellen Datenbank-Design fehlt. Dann, wenn perf immer noch ein Thema ist beginnt diese Technologien zu untersuchen.

Es gibt ein Datenbankschema, für die ich den Namen nicht erinnern kann, die diese Art von Situation umgehen kann. Sie haben grundsätzlich zwei Tabellen. Eine Tabelle speichert die Variablennamen und die anderen Geschäfte den Variablenwert. Wenn Sie die Variablen gruppieren möchten, dann eine dritte Tabelle hinzufügen, die eine Eins-zu-Beziehung mit dem Variablennamen Tisch haben. Dieser Aufbau hat den Vorteil, dass Sie halten das Hinzufügen verschiedene Variablen ohne Ihr Datenbankschema zu ändern halten zu müssen. Gespeichert mein Speck ein paar Mal recht, wenn sie mit Abteilungen zu tun, die ihren Geist (wie Marketing) häufig ändern.

Der einzige Nachteil ist, dass der Wert der Variablen Tabelle den aktuellen Wert als String-Spalte (varchar oder nvarchar tatsächlich) speichern müssen. Dann müssen Sie sich mit dem Aufwand umgehen die Werte zurück in ihre Heimat Darstellungen umzuwandeln. Ich bleibe noch so etwas wie diese. Die Variablentabelle hat derzeit rund 800 Millionen Zeilen. Es ist immer noch ziemlich schnell, da ich immer noch gewisse Schwankungen der Werte in weniger als eine Sekunde abrufen kann.

Ich bin kein C # Programmierer, aber Ich mag die mmap () -Aufruf und sah dort ist ein Projekt so etwas für C # zu tun.

Siehe Mmap

  

Strukturieren Dateien ausführen sehr, wenn für eine bestimmte Anwendung zugeschnitten sind aber schwer zu verwalten und eine kaum wieder verwendbare Code-Ressource. Eine bessere Lösung ist eine virtuelle Speicher-ähnliche Implementierung.

     
      
  • Bis zu 4 Gigabyte Informationen verwaltet werden.
  •   
  • Space optimiert reale Datengröße werden kann.
  •   
  • können alle Daten als ein einziges Array betrachtet werden und mit Lese- / Schreiboperationen zugegriffen.
  •   
  • Nein, um zu strukturieren zu speichern, aber nur zu nutzen und zu speichern.
  •   
  • Kann zwischengespeichert werden.   Ist sehr wiederverwendbar.
  •   

So gehen Sie mit SQLLite aus den folgenden Gründen:
1. Sie müssen jedes Mal
die gesamte Datenbank von der Festplatte nicht lesen / schreiben 2. Viel einfacher zu ergänzen, auch wenn Sie am Anfang genug Platzhalter nicht verlassen
3. Einfachere basierend auf etwas suchen möchten Sie
4. einfacher zu Daten in einer Weise zu ändern, über die Anwendung wurde entwickelt,

Probleme mit Wörterbuch Ansatz
1. Wenn Sie einen Smart-Wörterbuch gemacht Sie müssen jedes Mal der gesamte Datenbank lesen / schreiben (es sei denn, Sie sorgfältig die Datenstruktur Design wird es sehr schwer sein, um die Rückwärtskompatibilität)
----- a) wenn Sie nicht genug Platz Inhaber verlassen hat bye bye
2. Es scheint, als ob Sie müssten linear alle Fotos, um auf einer der Capture-Attribute
suchen durchsuchen 3. Kann ein Bild in mehr als eine Gruppe sein? Kann ein Bild unter mehr als einer Person sein? Können zwei Personen in der gleichen Gruppe sein? Mit Wörterbücher können diese Dinge haarig ....

Mit einer Datenbanktabelle, wenn Sie ein neues Attribut erhalten können Sie einfach sagen, Alter Table Bild Attribut Datentyp hinzufügen. Dann solange Sie nicht eine Regel machen sagen, das Attribut einen Wert haben, können Sie immer noch laden und ältere Versionen speichern. Zugleich können die neueren Versionen die neuen Attribute verwenden.

Auch brauchen Sie nicht das Bild in der Datenbank zu speichern. Sie könnten speichern nur den Pfad zu dem Bild in der Datenbank. Dann, wenn die App das Bild braucht, laden Sie einfach aus einer Datei. Dies hält die Datenbankgröße kleiner. Auch die zusätzliche Zugriffszeit die Festplatte Datei erhalten wird höchstwahrscheinlich unbedeutend im Vergleich zu der Zeit, um das Bild zu laden.

Wahrscheinlich sollten Sie Ihren Tisch werden
Bild (pictureid, GroupID ?, Dateipfad, Capture-Parameter 1, Capture-Parameter 2, etc ..)

Wenn Sie mehr Flexibilität wünschen, können Sie einen Tisch machen CaptureParameter (pictureid, Parametername, Parametervalue) ... ich abraten würde, weil es viel weniger effizient als nur ist sie in einer Tabelle setzen (nicht die Abfragen zu schweigen von den Capture-Parameter abzurufen / search wäre komplizierter).

Person (PersonID, Jede Person Attribute wie Name / usw.)
Gruppe (GroupID, Gruppenname, PersonID?)
PersonGroup? (PersonID, GroupID)
PictureGroup? (GroupID, pictureid)

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