Performance Probleme "Datenbank"

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Sisco.

    Performance Probleme "Datenbank"

    Hallo Zusammen,

    ich muss ein Programm von mir komplett neu schreiben (glaube ich), da ich immer mehr Performance Probleme habe.

    Ich kann in meinem Programm in einem Datagridview mehrere Daten eintragen.

    Diese Daten werden dann untereinander in folgender Form in einer Datei gespeichert:

    InhaltZeile1Spalte1;InhaltZeile1Spalte2;InhaltZeile1Spalte3 ..... (Bis zu 20 Spalten)
    InhaltZeile1Spalte1;InhaltZeile1Spalte2;InhaltZeile1Spalte3 ..... (Bis zu 20 Spalten)
    ..... (Teilweise bis zu 1000 Zeilen)

    Wenn ich das Programm Starte, werden alle Daten in ein DGV geladen (dient nur als Zwischenablage) und dann alle benötigten Daten von dort "ab zu holen"

    Das Problem ist jetzt, dass die Software recht langsam beim speichern wird und ich jetzt nicht weiß, ob es am einlesen in das DGV oder direkt am "abgleich" im DGV liegt.

    Gibt es noch andere Möglichkeiten.

    Gleich vor ab... Ich habe keine Möglichkeit einen SQL Server oder ähnliches zu nutzen.

    Sisco schrieb:

    Diese Daten werden dann untereinander in folgender Form in einer Datei gespeichert

    Sisco schrieb:

    Gleich vor ab... Ich habe keine Möglichkeit einen SQL Server oder ähnliches zu nutzen.

    Verwende dazu ein typ. Dataset, dass du problemlos als .XML speichern und laden kannst...
    Deine Tabelle im Dataset bindest du an dein DGV...
    Dataset-Only

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VB1963“ ()

    Ich muss das Thema noch einmal aufgreifen...

    Ich habe eine Datei auf einem Lokalen PC liegen. Nenne wir diese einfach mal Datenbank.txt

    Die Grundstruktur in der Datei Sieht wie folgt aus:

    Zeile1:Text1.1;Text1.2;Text1.3;Text1.4;Text1.5;Zahl1.1,Zahl1.2;Zahl1.3;Zahl1.4,Zahl1.5
    Zeile2:Text2.1;Text2.2;Text2.3;Text2.4;Text2.5;Zahl2.1,Zahl2.2;Zahl2.3;Zahl2.4,Zahl2.5
    ......

    Wenn ich etwas in diese Datei schreiben möchte mach ich das so:

    VB.NET-Quellcode

    1. '1. Datei in DGV einlesen
    2. Dim sreader As StreamReader = New IO.StreamReader("C:\Datenbank.txt", System.Text.Encoding.Default)
    3. Do While Not sreader.EndOfStream
    4. Dim zeilelesen As String = sreader.ReadLine
    5. If zeilelesen = Nothing Then
    6. Continue Do
    7. End If
    8. Dim zeilelesensplitt() As String = zeilelesen.Split(";")
    9. Me.Datagridview1.Rows.add(zeilelesensplitt(0),zeilelesensplitt(1),zeilelesensplitt(2),zeilelesensplitt(3),zeilelesensplitt(4), _
    10. zeilelesensplitt(5),zeilelesensplitt(6),zeilelesensplitt(7),zeilelesensplitt(8),zeilelesensplitt(9))
    11. loop
    12. sreader.close()
    13. '2. Eintrag suchen und ersetzen
    14. For i as Integer = 0 Me.Datagridview1.rows.count -1
    15. if Me.Datagridview1.item(0,i).value=Me.textbox1.text then
    16. Me.Datagridview1.item(1,i).value = me.Textbox2.text
    17. Me.Datagridview1.item(2,i).value = me.Textbox3.text
    18. Me.Datagridview1.item(3,i).value = me.Textbox4.text
    19. Me.Datagridview1.item(4,i).value = me.Textbox5.text
    20. Me.Datagridview1.item(5,i).value = me.Textbox6.text
    21. Me.Datagridview1.item(6,i).value = me.Textbox7.text
    22. Me.Datagridview1.item(7,i).value = me.Textbox8.text
    23. Me.Datagridview1.item(8,i).value = me.Textbox9.text
    24. Me.Datagridview1.item(9,i).value = me.Textbox10.text
    25. end if
    26. Next
    27. '3. Speichern
    28. Dim swriter As StreamWriter = New IO.StreamWriter("C:\Datenbank.txt", False, System.Text.Encoding.Default)
    29. dim datensatz as string
    30. for i as Integer = 0 to Me.Datagridview1.Rows.count -1
    31. datensatz = Me.Datagridview1.item(0,i).value & ";" & Me.Datagridview1.item(1,i).value & ";" & _
    32. Me.Datagridview1.item(2,i).value & ";" & Me.Datagridview1.item(3,i).value & ";" & _
    33. Me.Datagridview1.item(4,i).value & ";" & Me.Datagridview1.item(5,i).value & ";" & _
    34. Me.Datagridview1.item(6,i).value & ";" & Me.Datagridview1.item(7,i).value & ";" & _
    35. Me.Datagridview1.item(8,i).value & ";" & Me.Datagridview1.item(9,i).value
    36. swriter.Write(datensatz)
    37. next


    Es wird alles immer langsamer. Liegt warscheinlich auch dran, dass die Datei mittlerweile 500kB groß ist und die art und weise etwas umständlich ist, an die Datei ran zu kommen.
    Der Benutzer sitzt an einem Platz 1 dieser muss (durch Probleme die ich nicht weiter erläutern möchte) auf einem Server arbeiten, ca. 500km entfernt sitzt. Dieser Server greift aber auf die Dateien zu, die auf einem Server liegen, die Luftlinie ca. 10m vom Platz 1 entfernt sind.
    Zur verdeutlichung fals ich es etwas umständlich beschrieben habe:
    Platz1 -> Server1 (500km entfernt - Zugriff teilw. nur mit HSDPA gewschw.) -> Server 2 (Im selben Geb. wie Platz1)

    Ich bin irgendwie unzfrieden. An der Serveraufteilung kann ich leider nichts ändern. Ich glaube aber, dass es bessere möglichkeiten gibt, als den Code, den ich mir ausgeacht haben.
    Warum lädtst du das Gesumse eiglich in ein DGV?
    Iwelchen Textersatz kann man auch gut ohne DGV durchführen.

    Und ist natürlich richtig: Eine doppelt so große Datei durchzupflügen dauert länger. Es sind ja v.a. die Lese/Schreib-Vorgänge die dauern, sowie evtl. das Anzeigen im DGV (je nachdem wie das DGV konfiguriert ist).
    Puh.... Wie soll ich es beschreiben:

    Die Datenbank besteht aus einzelnen Maßnahmen:
    Als Beispiel:

    Maßnahmennummer;Maßnahmenbezeichnung;Nummer1;Nummer2;Nummer3;Nummer4;Nummer5,Nummer6,Nummer7,Nummer8

    Mittlerweile habe ich ca. 600Maßnahmen mit jeweils 1 bis 20 Einträge.
    Sieht im schlimmsten Fall so aus:
    001;Test001;1;2;3;4;5,6,7,8
    001;Test001;1;2;3;4;5,6,7,8
    001;Test001;1;2;3;4;5,6,7,8
    001;Test001;1;2;3;4;5,6,7,8
    001;Test001;1;2;3;4;5,6,7,8
    001;Test001;1;2;3;4;5,6,7,8
    001;Test001;1;2;3;4;5,6,7,8
    001;Test001;1;2;3;4;5,6,7,8
    002;Test002;1;2;3;4;5,6,7,8
    002;Test002;1;2;3;4;5,6,7,8
    002;Test002;1;2;3;4;5,6,7,8
    002;Test002;1;2;3;4;5,6,7,8

    Jetzt kann man in einer Form die Maßnahmennummer auswählen und dann wird die Datei eingelesen.
    Nicht gleich in ein DGV sondern es wird zweilenweise gelesen:

    VB.NET-Quellcode

    1. Dim sreader As StreamReader = New IO.StreamReader("C:\Datenbank.txt", System.Text.Encoding.Default)
    2. Do While Not sreader.EndOfStream
    3. Dim zeilelesen As String = sreader.ReadLine
    4. If zeilelesen = Nothing Then
    5. Continue Do
    6. End If
    7. Dim zeilelesensplitt() As String = zeilelesen.Split(";")
    8. if zeilelesensplitt(1) = Maßnahme then
    9. Me.Datagridview1.Rows.add(zeilelesensplitt(0),zeilelesensplitt(1),zeilelesensplitt(2),zeilelesensplitt(3),zeilelesensplitt(4), _
    10. zeilelesensplitt(5),zeilelesensplitt(6),zeilelesensplitt(7),zeilelesensplitt(8),zeilelesensplitt(9))
    11. end if
    12. loop
    13. sreader.close()


    Im DGV kann man dann die einzelnen Werte anpassen.

    Klar würde es auch mit jedem anderen Element gehen, aber im DGV finde ich die übersichtlichkeit zur Zeit am besten.
    So, haeb jetzt ersteinmal alles aus der txt in einer xml.

    Folgendes Format:

    XML-Quellcode

    1. <Massnahme>
    2. <MassnahmenID>0001</MassnahmenID>
    3. <Bild1>Nothing</Bild1>
    4. <Bild2>Nothing</Bild2>
    5. <Bild3>Nothing</Bild3>
    6. <Bild4>Nothing</Bild4>
    7. <Bild5>Nothing</Bild5>
    8. <Bezeichnung>Bezeichnung1</Bezeichnung>
    9. <Lfdnr>
    10. <LfdnrID>1</LfdnrID>
    11. <Position>Position</Position>
    12. <Beschreibung>Beschreibung</Beschreibung>
    13. <Zahl1>80</Zahl1>
    14. <Zahl2>68</Zahl2>
    15. <Zahl3>68</Zahl3>
    16. <Zahl4>0</Zahl4>
    17. <Zahl5>68</Zahl5>
    18. </Lfdnr>
    19. </Massnahme>


    Gerade mal 21.887 Zeilen. 8|

    Ich versuche mir jetzt ersteinmal ein Tool zu basteln, was den geschwindigkeitsunterschied raus gibt.