WPF bester und schnellster Weg Daten zwischenzuspeichern

  • WPF

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    WPF bester und schnellster Weg Daten zwischenzuspeichern

    Hallo,

    Ich arbeite gerade an einer WPF-Anwendung, die bestimmte Dateien überprüft und Probleme hervorhebt. Jetzt bin ich am überlegen, wie ich die gefundenen Probleme am besten "zwischenspeichern" kann. Ein Problem kann mehrere Zusatzinformationen/tags bekommen. Auch sollte über mehrere Threads gleichzeitig zwischengespeichert werden können.

    Bei großen Dateien (aber natürlich auch kleineren Dateien) kann es, aus unterschiedlichsten Gründen zu abstürzen kommen oder der Benutzer bricht den Vorgang aus irgendwelchen Gründen ab. Für solche Fälle sollten die Daten regelmäßig (alle x Minuten oder alle x geprüften Strings) in eine Datei (wahrscheinlich XML) geschrieben werden, damit beim nächsten Start automatisch beim letzten bekannten/gespeicherten Fortschritt weiter gemacht werden kann.

    Wären da jetzt Dictionaries oder XML-Dateien besser geeignet oder eine Kombination aus beidem, oder ganz was anderes?

    Edit: die gefundenen Probleme sollen dann am Ende der Reihenfolge des Dateiverlaufs (nicht der Reihenfolge des Funds) nach für den Benutzer aufgelistet werden und er kann dann entsprechende Aktionen ausführen. Diese werden dann auch wieder protokolliert (der Sicherungs-XML-Datei hinzugefügt). Das Ganze sollte sowohl effizient als auch schnell sein.

    LG,
    Pascal
    :!: Leider hab ich nicht immer Zeit zum Programmieren, da es eher ein Hobby ist. Falls ich mal im Forum ne Frage stelle und länger nicht antworte, nicht böse sein: Ich bin dann entweder beruflich oder mit der Familie zu sehr eingespannt oder einfach zu müde. Das kann erfahrungsgemäß auch mal über Wochen dauern, aber ich melde mich immer und setze die Frage ggf. auf beantwortet.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Translating-IT“ ()

    Hallo

    Gut, das ist jetzt nicht unbedingt ein WPf spezifisches Thema, aber ich gebe trotzdem gerne meinen senf dazu. =O
    Das einfachste und schnellste ist wohl die Serialisierung in eine XML. Also machst du dir deine Klassen mit den eigenschaften die du benötigst (haste vermutlich eh schon) und Serialisierst diese in eine XML.
    Das schöne ist, das dies alles mit Boardmitteln des .Net Frameworks geht, einfach und schnell ist.

    Du musst nur etwas aufpassen wenn du Thread-safe sein möchtest, die XMLs würde ich an deiner Stelle nur aus dem UI Thread aus Speichern/Lesen.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Danke, das habe ich mir eh schon fast gedacht. Wollte nur sichergehen.

    LG,
    Pascal
    :!: Leider hab ich nicht immer Zeit zum Programmieren, da es eher ein Hobby ist. Falls ich mal im Forum ne Frage stelle und länger nicht antworte, nicht böse sein: Ich bin dann entweder beruflich oder mit der Familie zu sehr eingespannt oder einfach zu müde. Das kann erfahrungsgemäß auch mal über Wochen dauern, aber ich melde mich immer und setze die Frage ggf. auf beantwortet.
    Ich meinte jetzt nicht mal unbedingt Abstürze der Software direkt, sondern eher des gesamten PCs. Ich weiß aus eigener Erfahrung, dass dies bei großen Dateien sehr lästig sein kann, jedes Mal neu anfangen zu müssen, weil sich mal wieder irgendwas verabschiedet hat. Es geht dabei mehr um die allgemeine Vermeidung von Stress. ;)

    Abstürze der Software selbst sollen natürlich, falls sie vorkommen abgefangen, protokolliert und ggf. an den Entwickler zwecks Behebung zur Vermeidung in zukünftigen Versionen weitergeleitet werden.

    Oder meintest Du, dass ich z. B. Log4Net für die Zwischenspeicherung der Daten in eine Datei "missbrauchen" soll.
    :!: Leider hab ich nicht immer Zeit zum Programmieren, da es eher ein Hobby ist. Falls ich mal im Forum ne Frage stelle und länger nicht antworte, nicht böse sein: Ich bin dann entweder beruflich oder mit der Familie zu sehr eingespannt oder einfach zu müde. Das kann erfahrungsgemäß auch mal über Wochen dauern, aber ich melde mich immer und setze die Frage ggf. auf beantwortet.
    Muss die Datei denn von Menschen lesbar sein? Wenn nicht kannst du dir überlegen, ob du eine Embedded Database benutzen willst. Das hätte mehrere Vorteile:

    a) Nimmt dir die ganze harte Arbeit ab: Multithreading, File Locking, Konsistenzbedingungen, ... sind alles Probleme, um die sich die Datenbank kümmert.
    b) Um einiges performanter als XML/JSON/whatever.
    c) Du kannst später, weil es eine DB ist, deine ganzen Daten auch per LINQ/Queries (performant) analysieren, wenn nötig.

    Wenn das generell für dich in Frage kommt könntest du dir z.B. LiteDB (litedb.org) anschauen. Das coole daran ist, dass du wirklich mit minimalem Aufwand dein Ziel erreichen kannst und dich nicht mit SQL oder ähnlichem rumschlagen musst. Du kannst einfach eine Klasse für deine Daten erstellen und sie so wie sie ist in die DB speichern und später wieder auslesen. Der Getting Started Guide (litedb.org/docs/getting-started/) zeigt das an nem kleinen Beispiel.
    Du kannst das alles natürlich auch mit XML oder ähnlichem machen, aber vielleicht ist LiteDB für dich ja ne interessante Alternative. ;)
    An DB hatte ich auch schon gedacht, aber ich hatte voll darauf vergessen, dass ich diese auch zur Protokollierung nutzen könnte (obwohl ich das in anderen Webanwendungen schon so mache). Ich hatte die DB eher für einen anderen Teil der Software im Hinterkopf. Hab mal wieder nicht weit genug gedacht, bzw. das Alterprobte vergessen. ^^

    An sich geht es darum, dass nach einem Absturz, der Fortschritt bzw. die Fehlerdatensätze auslesbar sein sollen, damit dort oder unmittelbar in der Nähe fortgefahren werden kann, wo aufgehört wurde bzw. ein Absturz aufgetreten. Am Ende müssen dann eh die ganzen Datensätze für diese Datei in einem Fenster als Tabelle aufgelistet werden.

    Dies dient dazu, dass einerseits Fehler gleich behoben werden können oder Kommentare hinterlassen werden können (warum welche Entscheidung getroffen wurde). Wenn dann später wer anderer sich die Logs anschauen will, bekommt er wieder alles über die Software aufgelistet.

    Dies wäre sowohl mit einer DB oder über XML lösbar. Mein Gedanke war auch wegen des Multithreadings bzw. Filelockings eine DB zu nutzen. Am Ende könnten die Daten dann in eine XML oder andere Datei exportiert werden, die dem Kunden oder Vorgesetzten zugeschickt werden kann und die dieser dann über die Software einlesen kann, damit er alles als Tabelle auf einen Blick sieht. Nach dem Export in eine Datei können die Datensätze in der DB ja dann wieder gelöscht werden, um Platz freizugeben.

    Mit der DB könnte ich dann auch ein paar andere Dinge leichter lösen, die mir bei XML aufgefallen sind, aber in diesem Fall mit 2 oder 3 Schritten mehr (somit auch mehr Zeit bei der Verarbeitung der Datei) zu lösen sind.

    SQL u. Ä. wären kein Problem für mich. Was Datenbanken angeht, bin ich da also eher offen.
    :!: Leider hab ich nicht immer Zeit zum Programmieren, da es eher ein Hobby ist. Falls ich mal im Forum ne Frage stelle und länger nicht antworte, nicht böse sein: Ich bin dann entweder beruflich oder mit der Familie zu sehr eingespannt oder einfach zu müde. Das kann erfahrungsgemäß auch mal über Wochen dauern, aber ich melde mich immer und setze die Frage ggf. auf beantwortet.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Translating-IT“ ()

    Translating-IT schrieb:

    Mit der DB könnte ich dann auch ein paar andere Dinge leichter lösen, die mir bei XML aufgefallen sind, aber in diesem Fall mit 2 oder 3 Schritten mehr (somit auch mehr Zeit bei der Verarbeitung der Datei) zu lösen sind.

    Alleine das spricht dann ja schon dafür, dass du eher eine DB, als eine XML Datei benutzen solltest. Es gibt ja keinen Grund dich mit Dateien rumzuschlagen, wenn eine DB dir dein Leben schon leichter macht. "The right tool for the right job", sozusagen. ^^

    Translating-IT schrieb:

    Ich hatte die DB eher für einen anderen Teil der Software Hinterkopf.

    Es spricht ja auch nichts dagegen, 2 oder mehrere DBs zu haben. Eine für den Teil den du im Kopf hast und eine (oder gleich mehrere) für den Progress. Dann sind die beiden voneinander unabhängig und du kannst, wenn nötig, die DB mit den Logs etc. einfach löschen/leeren, wenn du sie nicht mehr brauchst.

    Wenn du mit SQL kein Problem hast werfe ich noch SQLite in den Raum. Das ist meines Wissens nach die embedded DB und es gibt auch zahlreiche .NET Libraries mit denen du darauf zugreifen kannst.
    LiteDB hat, wie gesagt, auch seinen Charme. Es kommt ein bisschen darauf an was dir wichtig ist. LiteDB erlaubt es dir halt, unglaublich schnell zu iterieren und einen funktionierenden Prototypen auf die Beine zu stellen, aber du verlierst erstmal die "Striktheit" von relationalen Datenbanken (die ja in den meisten Fällen nützlich ist).
    Kannst ja mal beide Optionen vergleichen und schauen, was besser für deine App ist. Die beste Lösung gibt es hier nicht, beide Optionen haben im Vergleich Vor- und Nachteile.
    schaut mit SQLite bis jetzt gang gut aus. ;) Hat mir sogar damit geholfen ein weiteres Problem durch hinzufügen von einer Spalte zu lösen, das später aufgetaucht ist, aber mit xml oder so nicht so einfach lösbar gewesen wäre.
    :!: Leider hab ich nicht immer Zeit zum Programmieren, da es eher ein Hobby ist. Falls ich mal im Forum ne Frage stelle und länger nicht antworte, nicht böse sein: Ich bin dann entweder beruflich oder mit der Familie zu sehr eingespannt oder einfach zu müde. Das kann erfahrungsgemäß auch mal über Wochen dauern, aber ich melde mich immer und setze die Frage ggf. auf beantwortet.

    shad schrieb:

    Muss die Datei denn von Menschen lesbar sein? Wenn nicht kannst du dir überlegen, ob du eine Embedded Database benutzen willst. Das hätte mehrere Vorteile:


    sry, etwas offtopic, aber eignet sich eine solche Embedded Database wie diese LiteDB, auch um mehrere Nutzer zeitgleich darauf zugreifen zu lassen ? HIntergrund wäre, das wir in der Firma zwar ein Netzlaufwerk haben, aber ich keine richtige Datenbank oder dergleichen aufsetzen kann/darf, für Multiuserzugriff muss ich mir bisher per xml-Serialisierung und einem pessimistic lock behelfen, so dass nur ein Nutzer zeitgleich Änderungen durchführen kann.
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    Hi Asusdk,

    es wäre wahrscheinlich besser, einen neuen Thread dafür aufzumachen. Hier wird wohl kaum wer antworten, da die Frage schon als gelöst gekennzeichnet ist und deine eine ganz andere Frage ist.
    :!: Leider hab ich nicht immer Zeit zum Programmieren, da es eher ein Hobby ist. Falls ich mal im Forum ne Frage stelle und länger nicht antworte, nicht böse sein: Ich bin dann entweder beruflich oder mit der Familie zu sehr eingespannt oder einfach zu müde. Das kann erfahrungsgemäß auch mal über Wochen dauern, aber ich melde mich immer und setze die Frage ggf. auf beantwortet.