(Volumen)Grenzen von Variablen

  • VB.NET

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

    (Volumen)Grenzen von Variablen

    Hallo Zusammen,

    im Moment fällt mir bei meinem Programm ziemlich massiv auf, dass es nicht ratsam ist "Unmengen" (ist relativ) an Daten in einen einzelnen String abzuspeichern.

    Mit Unmengen meine ich eine _MyString.Length > 1600000 '// 1.600.000. Wenn diese Grenze überschritten ist, bricht mein Programm von der Verarbeitungsgeschwindigkeit massiv ein.

    Insgesamt fällt bei meinem Programm zum Schluss eine ~10MB Logdatei raus. Das sind ~10x 1.600.000 = 16.000.000.


    Nun stelle ich mir die Frage ob irgendwo nachzulesen ist, wie viel in z.B. einem String maximal gespeichert werden sollte?

    In meinem späteren Programmverlauf hatte ich geplant eine List(Of BananenStruc) mit mehr als durchschnittlich 20.000 Einträgen zu füllen. Die Struc würde beinhalten:

    4 x Integer / 3 x String / 1 x Double / 1 x UInt32 - Alles nur kleine Werte/Längen.

    Weiß jemand ob es auch solche Grenzen bei List(Of gibt?


    Gruß, FireEmerald

    FireEmerald schrieb:

    List(Of
    hat eine Property Count vom Typ Integer.
    Es ist also anzunehmen, dass Integer.MaxValue = 2147483647 ' &H7FFFFFFF Werte abgelegt werden können.
    Mach Dir ein kleines Testprogramm und probiere es aus.
    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!
    Hey,

    wenn Du mit Strings in dieser Größenordnung arbeitest, dann unbedingt

    System.Text.StringBuilder

    verwenden. Diese Klasse hat einen massiven Geschwindigkeitsvorteil. Diese Klasse hat auch eine .MaxCapacity-Property, die die maximale Länge angibt. 1.600.000 Zeichen sollten jedoch kein Problem sein. Jedoch gilt, so wenig wie möglich, so viel wie nötig.

    Die theoretische Grenze einer Liste kannst Dir ja "erdenken", wenn Du überlegst, welchen Datentyp Du als Index übergibst. Praktisch gilt die Grenze Deines Arbeitsspeichers. 20.000 Einträge sind "ein Witz".
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    .Length ist auch ein Int32, somit auch auf 2.147.483.647 begrenzt. Das wäre dann der "Worst Case", jedoch kommt es schon sehr viel früher zu Problemen ^^

    Denke es könnte sein, dass eine List(Of performanter ist als ein simpler (langer) String. - Bevor ich jetzt aber alle Möglichkeiten durch teste wollte ich erst mal nachfragen.

    @SpaceyX Danke für den Tipp ;)
    Das Problem bei einem String ist, dass dieser eine kleine Sonderfunktion hat. Ein String ist im Framework "immutable" also "unveränderbar".
    Das heißt wenn du

    VB.NET-Quellcode

    1. Dim s = "Hallo"
    2. s &= " du"

    machen würdest legt er bei jeder erneuten Zuweisung eine neue Instanz an und verwirft die alte. Das frisst natürlich Leistung.
    Hierbei 2 Beispiele welche einmal mit normalen Stringverknüpfungen und einmal mit der StringBuilder-Klasse gelöst wird.
    Stringverknüpfung:

    VB.NET-Quellcode

    1. Sub Main()
    2. Dim s As String = String.Empty
    3. Dim sw As New Stopwatch
    4. sw.Reset()
    5. sw.Start()
    6. For i As Integer = 0 To 30000
    7. s &= String.Format("Durchlauf {0}", i)
    8. Next
    9. sw.Stop()
    10. Console.WriteLine(sw.ElapsedMilliseconds.ToString)
    11. Console.Read()
    12. End Sub


    Stringbuilder:

    VB.NET-Quellcode

    1. Sub Main()
    2. Dim s As String = String.Empty
    3. Dim sb As New System.Text.StringBuilder
    4. Dim sw As New Stopwatch
    5. sw.Reset()
    6. sw.Start()
    7. For i As Integer = 0 To 30000
    8. sb.Append(String.Format("Durchlauf {0}", i))
    9. Next
    10. s = sb.ToString
    11. sw.Stop()
    12. Console.WriteLine(sw.ElapsedMilliseconds.ToString)
    13. Console.Read()
    14. End Sub


    Bei solch langen Strings bietet sich der StringBuilder förmlich an.

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Wie sehen denn die Daten selbst aus?
    Was must Du damit machen?
    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!
    @RodFromGermany Es handelt sich bei dem "großen" String um einen Log. Sprich einfach nur Text mit vielen Zeilenumbrüchen. Beispiel: "Berechnung gestartet, keine Fehler."

    Die List(Of BananenStruc) wird später weiter verarbeitet, auch wieder zu einem String. Nur der sieht dann halt so ähnlich aus:
    "Teuer: Neue Bananen sind eingetroffen: 10 Stück, für 2,50€ im Edeka." - Die einzelnen Int, Strings, etc. werden in eine Syntax gebracht - Je nach Variablen.
    "Günstig: Neue Bananen sind eingetroffen: 49 Stück, für 1,49€ im Netto."
    Log-Daten solltest Du gar nicht erst im Arbeitsspeicher halten, sondern zyklisch in eine Datei schreiben. Dann stellt sich dieses Problem schon gar nicht erst.

    Für Dein 2. Vorhaben würde ich schon fast zu einem typ. DataSet tendieren. Kommt darauf an, was Du konkret damit vor hast.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Ich muss da noch mal @SpaceyX> hervorheben. Du solltest - solange du keinen wahlfreien Zugriff auf alle Daten gleichzeitig brauchst - mit Streams arbeiten. Die sind dafür gemacht.

    Für die List(Of T) spielt die größe des Structs keine Rolle. In der Liste landet nur eine Referenz, die auf 64-Bit-Systemen 64 Bit und auf 32-Bit-Systemen 32 Bit groß ist.
    Bedenke aber, dass der gesamte Speicherverbrauch sehr wohl davon beeinflusst wird.
    Von meinem iPhone gesendet