Daten schreiben dauert lange

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von ~blaze~.

    Daten schreiben dauert lange

    Hallo, ich habe mir einen Kalorienmanager geschrieben. Da hier jeden Tag einige Eintragungen gemacht werden, wächst die Datengröße täglich kontiunierlich an. Könnt ihr mir bitte Anregungen geben, wie ich Daten schneller lesen und schreiben kann.

    Bisher mache ich es so: In einer Schleife werden alle Daten zu einem Datensatz zusammengefasst und dann gespeichert. Da das Programm jetzt schon ca. ein Jahr genutzt wird, dauert der Schreibvorgang schon recht lange...

    VB.NET-Quellcode

    1. For a% = 1 To Eintragungen.anzahl_eintragungen
    2. Dateiinhalt_Eintragungen += Eintragungen.anwender(a%) & ControlChars.CrLf
    3. Dateiinhalt_Eintragungen += Eintragungen.Lebensmittel_Einheit(a%) & ControlChars.CrLf
    4. Dateiinhalt_Eintragungen += Eintragungen.Lebensmittel_gesamtbrennwert(a%) & ControlChars.CrLf
    5. Dateiinhalt_Eintragungen += Eintragungen.Lebensmittel_gesamteiweis(a%) & ControlChars.CrLf
    6. Dateiinhalt_Eintragungen += Eintragungen.Lebensmittel_gesamtfett(a%) & ControlChars.CrLf
    7. Dateiinhalt_Eintragungen += Eintragungen.Lebensmittel_gesamtkohlehydrate(a%) & ControlChars.CrLf
    8. Dateiinhalt_Eintragungen += Eintragungen.Lebensmittel_gesamtzucker(a%) & ControlChars.CrLf
    9. Dateiinhalt_Eintragungen += Eintragungen.Lebensmittel_Menge(a%) & ControlChars.CrLf
    10. Dateiinhalt_Eintragungen += Eintragungen.Lebensmittel_Name(a%) & ControlChars.CrLf
    11. Dateiinhalt_Eintragungen += Eintragungen.Tag(a%) & ControlChars.CrLf
    12. Next
    13. Using writer As New IO.StreamWriter(dateiname_anwender_daten)
    14. writer.Write(Dateiinhalt_Eintragungen)
    15. writer.Close()
    16. End Using
    Zunächst ist die %-Kennzeichnung für Integer out, wir schreiben .NET:

    VB.NET-Quellcode

    1. For a As Integer = 1 To Eintragungen.anzahl_eintragungen

    Im selben Atemzug: Option Strict On, damit Du künftig weniger Fehler machst.
    Und:
    Es sieht so aus, als ob Du Strings abspeicherst.
    Du solltest Deine Daten-Verwaltung völlig neu machen.
    Da bietet sich eine Datenbank an, da sind im Forum genügend Threads gezogen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Wie bereits erwähnt, ist Datenbank die vernünftigste Lösung.
    Für den Übergang: String-Verkettung mit "&" oder "+" ist bei großer Anzahl von Elementen der Performance-Killer. Nimm statt dessen den StringBuilder, oder in diesem Fall würde ich direkt mit dem 'writer' die Daten in die Datei schreiben. Dazu musst Du natürrlich die For-Schleife in den Using-Block verlagern.
    Danke erstmal für eure Tipps.

    Datenbank würde mich schon reizen, hab da aber halt null Erfahrung und deshalb noch paar Fragen:

    • Braucht man dazu noch irgendwas anderes (anderes Programm?) ausser VB?
    • Da gibt es ja sicherlich viele Methoden was könnt ihr da für einen Einsteiger empfehlen.
    • Ist das was was sich einfach lernen lernst oder sollte man sich ein Buch zulegen?

    Habe jetzt mein Problem erstmal anderweitig gelöst. Habe eine Archivdatei angelegt, die nur geladen wird wenn sie wirklich gebraucht wird. Jetzt dauert der Speichervorgang wieder 2 Sekunden. Damit bin ich erstmal zufrieden, da ich zeitlich grad wenig Möglichkeiten habe.
    • Braucht man dazu noch irgendwas anderes (anderes Programm?) ausser VB?
      In VisualStudio ist SqlServer und SqlCe bereits enthalten. SqlCe täte ausreichen.

    • Da gibt es ja sicherlich viele Methoden was könnt ihr da für einen Einsteiger empfehlen.
      "Datenbank in 10 Minuten" auf Movie-Tuts

    • Ist das was was sich einfach lernen lernst oder sollte man sich ein Buch zulegen?
      Da sind ja noch mehr Tuts auf der Site. ;)
      Und in den VBP-Tuts verbreiter ich mich ja auch mehr als ausführlich


    Insgesamt zweifel ich aber, ob du wirklich eine DB brauchst. Man kann ganz hervorragend DB-Programmierung ohne Datenbank betreiben - das ist nur halb so schwer und immer noch reichlich schwer genug ;)

    Wie groß ist deine Daten-Datei? Mit typisiertem Dataset habe ich schon Anwendungen flüssig laufen gehabt, die sich beim Startup erstmal ein 400MB - Dataset in' Kopp gesogen hatten - ohne jedes Problem (das Problem hatte ich, weil ich sonen Umgang mit Resourcen schon unmoralisch finde ;))

    Habe jetzt mein Problem erstmal anderweitig gelöst. Habe eine Archivdatei angelegt, die nur geladen wird wenn sie wirklich gebraucht wird. Jetzt dauert der Speichervorgang wieder 2 Sekunden. Damit bin ich erstmal zufrieden, da ich zeitlich grad wenig Möglichkeiten habe.
    2 Sekunden ist zu lang. In 2 Sekunden lade ich > 100MB an Daten. Da sind bei dir IMO Verarbeitungs-Algorithmen zu verbessern.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Dein allgemeiner Programmierstil ist u.a. dafür verantwortlich wieso es so lange dauert.

    1. a% ist eine alte Bezeichung aus QuickBasic zeiten
    2. Du Addierst Strings? Was bitte ist denn 5 + "Hallo" ??
    3. Du erstellt in der Schleife eine String Variable der immer was hinzu fügst und speicherst es dann im StreamWriter -> Sinn? Wieso nicht gleich in der Schleife in Streamwriter schreiben??

    VB.NET-Quellcode

    1. Using sw As New StreamWriter("datei")
    2. For i As Integer = 0 To 6
    3. sw.WriteLine("hallo Zeile")
    4. Next
    5. End Using

    xtts02 schrieb:

    Wie bereits erwähnt, ist Datenbank die vernünftigste Lösung.

    Datenbank kann man durchaus machen wenn man sich zur Übung mit dem Thema auseinandersetzen möchte.

    Allerdings schliesse ich mich (ausnahmsweise) der Meinung von EDR an: notwendig ist sie bei dem wohl eher geringen Datenaufkommen kaum (Info über das Datenaufkommen wäre hilfreich).

    Andere Möglichkkeit ist typisiertes Dataset/Table ( EDR's Dauer- und Standardvorschlag ).

    Meine Vorliebe wäre:
    - Daten in List (of T) ggf. Bindinglist
    - Speicherung: XML-Serialisierung
    - Auswertung : LinQ
    - Anzeige: DataGridView

    Wie Du 2 Sekunden fürs Speichern brauchen kannst , ist mir allerdings genauso ein Rätsel.
    Durch das zusammenfügen von String mit dem & oder in schlechten Fällen auch + dauert das extrem lange. Er hat dort 10 Teilen in der Schleife und keiner weiß wie oft die Schleife druchläuft. Jemand hat mal schönes Testtool gemacht mit Strings so zusammen fügen oder mit dem StringBuilder. Bei wenig Text hielt es sich die Waage, aber bei 1000 durchläufen bliebt der Stringbuilder fast gleich aber das & stieg unglaublich hoch an.
    Danke für den Tipp mit dem Stringbuilder, der hat einiges gebracht, jetzt flutscht es grade zu.

    Die Schleife wurde zuletzt ca. 3500 mal durchlaufen mit je 10 Werten, die dann immer wieder dem String zugefügt wurden.

    Ich glaube mein schlechter Programmierstil rührt daher, dass ich mit Basic 1.0 über GW Basic damals angefangen hab und mir immer alles so selber beigebracht habe.

    Danke für eure Hilfe, der Tipp auch den nicht einen Dateiinhalt zusammenzusetzen, sondern es gleich im Streamwriter zu schreiben macht natürlich auch Sinn.



    Danke an alle

    Humax schrieb:

    Ich glaube mein schlechter Programmierstil rührt daher, dass ich mit Basic 1.0 über GW Basic damals angefangen hab und mir immer alles so selber beigebracht habe.

    Das übliche ;)

    Ein Problem mit vb.net ist, dass Umsteiger denken, sie könnten auch nur irgendetwas weiterhin so machen, wie sie gewohnt waren. Tatsache ist: man muß alles, ausnahmslos!, vergessen, und die neuen Konzepte ganz von vorne sich erarbeiten.

    Die Katastrophe bei diesem Problem ist, dass vb.net die obsoleten Vorgehensweisen weiterhin relativ weitgehend unterstützt - was dazu führt, dasses selbst inne Arbeitswelt gestandene Programmierer gibt, die in wesentlichen Bereichen auch nach Jahren in .Net immer noch keine Ahnung haben, und es aber auch nie merken werden.

    Ich empfehle dieses Buch Lesen, dann hat man Ahnung.