Ascii-Datei einlesen und Inhalt in umgekehrter Reihenfolge wieder ausgeben. erster Versuch läuft sehr langsam

  • VB.NET
  • .NET (FX) 3.0–3.5

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von HBMAN.

    Ascii-Datei einlesen und Inhalt in umgekehrter Reihenfolge wieder ausgeben. erster Versuch läuft sehr langsam

    Hallo,
    ich muß eine sehr große Ascii-Datei einlesen und in umgekehrter Reihenfolge wieder ausgeben. Im konkreten Beispiel ist die Datei 380MB groß und hat 16 Millionen Zeilen. Es wird aber auch noch größere Dateien geben.
    Ich habe etwas programmiert, was prinzipiell zu funktionieren scheint. Aber das Programm ist sehr langsam. Ich bekomme sogar Meldungen "ContextSwitchDeadlock wurde erkannt, die CLR konnte 60Sek lang keinen Übergang vom COM-Kontext..."
    Wie sollte das Programm aufgebaut sein ? Ist es überhaupt schlau, die einzulesende Datei in einer Collection zu speichern ?

    VB.NET-Quellcode

    1. Dim zeile As New Collection
    2. 'Laden:
    3. Dim datei As New IO.StreamReader(Dateiname_Laden, System.Text.Encoding.Default)
    4. i = 0
    5. Do
    6. temp = datei.ReadLine()
    7. zeile.Add(temp)
    8. If IsNothing(temp) Then Exit Do
    9. i = i + 1
    10. Loop
    11. datei.Close()
    12. 'Speichern:
    13. Dim datei As IO.StreamWriter
    14. datei = New IO.StreamWriter(Dateiname_Speichern, False, System.Text.Encoding.Default)
    15. For i = zeile.Count To 1 Step -1
    16. datei.WriteLine(zeile.Item(i))
    17. Next
    18. src.Close()


    Danke für Eure Hilfe

    CodeTags gesetzt ~VaporiZed

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

    Willkommen in Forum.
    Probier es mal etwas einfacher:

    VB.NET-Quellcode

    1. Dim Dateizeilen = IO.File.ReadAllLines(Dateiname_Laden, System.Text.Encoding.Default) 'Achtung! Default ist in .NET-Framework was anderes als in .NET!
    2. IO.File.WriteAllLines(Dateiname_Speichern, Dateizeilen.Reverse, System.Text.Encoding.Default)


    Wenn das Programm mehr als 1 Minute damit beschäftigt ist, geht Windows davon aus, dass die App sich in einer Endlosschleife befindet und schlägt Alarm. Wenn dem auch hier so ist, ist wohl ein portionsweises Einlesen oder nebenläufiges Laden sinnvoll. Aber eines nach dem anderen (probieren).
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    ich wüsste da prinzipiell auch nix besseres.
    Man kann den Kram evtl. in einen Nebenthrad verlegen, aber dazu müsstest du erstmal eine richtige Sub programmieren.
    Collection ist natürlich auch oller vb6-Müll - aber das wird sich nicht auf die Geschwindigkeit auswirken.
    Vor allem: Miss erstmal nach, was so lange dauert: Das Lesen oder das Schreiben?
    Hallo,
    ich bin erstaunt, wie kurz man es doch machen kann. Danke schon mal für die gute Hilfe.

    Leider bin ich absoluter Amateur in der Programmierung. Daher habe ich die Angabe des NetFrameworks von dem Computer hier sicherlich falsch angegeben. Ich dachte, es kommt bei meinem Problemchen nicht drauf an. Ich bitte dafür um Entschuldigung. Ich habe daher noch einmal nach der Installation geschaut: Microsoft Visual Basic 2008 Version 9.0.21022.8 RTM Microsoft.NET Framework Version 3.5 SP1.


    Ich habe beim Debuggen noch folgenden Fehler beim Dateizeilen.Reverse:
    System.InvalidCastException wurde nicht behandelt.Message="Das Objekt des Typs "<ReverseIterator>d__99`1[System.String]" kann nicht in Typ "System.String[]" umgewandelt werden."

    ...
    IO.File.WriteAllLines(dateiname, Dateizeilen.Reverse, System.Text.Encoding.Default)
    ...
    Ebenfalls: Willkommen im Forum. :thumbup:

    HBMAN schrieb:

    Microsoft Visual Basic 2008
    solltest Du schleunigst auf eine neuere Version updaten.
    Studio 2022 ist aktuell, hat aber einige Macken.
    Studio 2019 veraltet langsam, ist aber voll in Ordnung.
    Probier mal die Zeilen mit .ToArray() auszugeben, da musst Du ggf. LINQ importieren

    VB.NET-Quellcode

    1. IO.File.WriteAllLines(dateiname, Dateizeilen.Reverse.ToArray(), System.Text.Encoding.Default)
    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!
    man könnte auch vs2017 in Betracht ziehen, dassis glaub die letzte Version, bei der man sich nicht regelmässig mit einem MS-Konto anmelden muss.
    Also bis 2017 hast du noch die Hoheit über dein Entwicklungs-System.
    Alles danach liefert kontinuirlich beliebige Daten an MS aus, und wenn MS es mal gefällt, die Gratis-Benutzung zu beenden, wars das dann auch.

    ErfinderDesRades schrieb:

    bei der man sich nicht regelmässig mit einem MS-Konto anmelden muss.


    Ich nutze VS2022 CE und muss mich nicht anmelden, kann das Fenster einfach zu machen wenn es denn mal beim starten erscheint und losarbeiten. In VS2019 da musste ich mich anmelden, sonst konnte ich nicht arbeiten.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D
    Vielen Dank an alle, die mir hier geholfen haben !
    Das Programm läuft nun mit dem ".ToArray()". Es ist ja quasi ein Zweizeiler geworden und die Konvertierung der riesigen Datei hat nur 2~3 Sekunden gedauert ! Ich bin echt beeindruckt.

    viele Grüße und ein schönes Wochenende