Datei Effizient auslesen und verarbeiten

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von picoflop.

    Datei Effizient auslesen und verarbeiten

    Guten Abend :)

    Ich bin gerade wieder auf neue Ideen gekommen und muss eine Datei auslesen(reine Binärdaten, ca. 16 MB), das ganze funktioniert auch mit der "ReadBytes" Methode der Klasse BinaryReader, allerdings muss ich die Daten danach verarbeiten und wenn ich versuche das ganze in einer Schleife einzulesen braucht er ewig um zu rechnen(ich muss nicht viel damit machen, nur in einer Textbox ausgeben, im Hexadezimalen System, also eigentlich kein großer Aufwand)

    Gibt es effizientere Methoden um die ganzen Daten zu verarbeiten, meine User haben sicher nicht genug Zeit um solange zu warten und ein hexeditor(Beispielsweiße) schafft so etwas ja auch schneller.

    Wäre über Hilfe erfreut :)

    ~Sturmvogel~
    zuerst in einen BytArray laden, dieser kann dann schnell durchlaufen werden...System.IO.File.ReadAllBytes(...)
    ich weiß jedoch nicht, ob das ganze schneller ist als ein BinaryReader...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Nein das kann eben nicht schnell durchlaufen werden, zumindest braucht er bei mir ewig um das Array dann auszulesen und zu verarbeiten, einlesen geht schnell, auch mit BinaryReader, das ist kein Problem, nur kann ich das ByteArray dann nur langsam verarbeiten^^

    lg
    einlesen geht schnell, auch mit BinaryReader, das ist kein Problem, nur kann ich das ByteArray dann nur langsam verarbeiten^^

    In diesem Fall wäre es sinnvoll, den Code zu haben, mit dem du das ganze weiterverarbeitest, um ggf. auf mögliche Optimierungsmöglichkeiten zu verweisen.
    natürlich, aber wie gesagt das ist nchts spektakuläres...

    VB.NET-Quellcode

    1. for each b as byte in DataBytes
    2. txtOutput.Text &= b.tostring("x")" & " ")
    3. next b


    Weiß nicht was ich groß optimieren sollte, ich denke ich brauche da eher ein ganz neues Konzept, da das ganze nicht ein paar Perfomance Schwächen hat sondern eine halbe Stunde rechnet :/

    lg
    Was man da optimieren soll??? Allein schon der ständige Zugriff auf die GUI ist schonmal furchtbar. Benutz doch z.B. einen StringBuilder (in dem Beispiel kann man im Prinzip gleich die einzelnen Bytes lesen, aber egal...)

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private s As System.Text.StringBuilder
    3. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    4. Using ofd As New OpenFileDialog With {.Filter = "Alle Dateien (*.*)|*.*"}
    5. If ofd.ShowDialog = Windows.Forms.DialogResult.OK Then
    6. s = New System.Text.StringBuilder
    7. Dim f As New IO.FileStream(ofd.FileName, IO.FileMode.Open)
    8. Dim read As Integer = 4097
    9. Dim buffer(4096) As Byte
    10. Do Until read <> 4097
    11. read = f.Read(buffer, 0, buffer.Length)
    12. Array.ForEach(buffer, Function(b As Byte) s.Append(b.ToString("x")))
    13. Loop
    14. f.Close()
    15. MessageBox.Show("fertig!")
    16. End If
    17. End Using
    18. End Sub
    19. End Class

    Und da gibt es noch weitere Optimierungsmöglichkeiten...

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

    Ok, auf sowas wie nen StringBuilder hätte ich kommen sollen, das umrechnen funktioniert jetzt schon um einiges schneller, allerdings braucht er immer noch ewig beim schreiben in die Textbox, ich meine ja, es ist viel, es sind 16 MB, gibts da was schnelleres als eine einfache Zuweißung? Fällt mir nicht wirklich was ein...^^

    lg

    Sturmvogel schrieb:

    gibts da was schnelleres als eine einfache Zuweißung?

    ????

    Statt .ToString ein temp. Array(255) vorher mit den entsprechenden Hex-Codes füllen.

    BTW: Wie langsam ist "langsam"?

    Testklasse:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class HexConverter
    2. Private Shared IsInitialized As Boolean = False
    3. Private Shared LowerByte(255) As Byte
    4. Private Shared UpperByte(255) As Byte
    5. Public Sub New()
    6. If Not IsInitialized Then
    7. IsInitialized = True
    8. For i As Integer = 0 To 255
    9. LowerByte(i) = Asc((i Mod 16).ToString("X"))
    10. UpperByte(i) = Asc((i \ 16).ToString("X"))
    11. Next
    12. End If
    13. End Sub
    14. Public Function Convert(ByVal InBytes() As Byte) As String
    15. Dim b(InBytes.Count * 2 - 1) As Byte
    16. Dim offset As Integer = 0
    17. For i = 0 To InBytes.Count - 1
    18. b(offset) = UpperByte(InBytes(i))
    19. offset += 1
    20. b(offset) = LowerByte(InBytes(i))
    21. offset += 1
    22. Next
    23. Return System.Text.Encoding.ASCII.GetString(b)
    24. End Function
    25. End Class


    Aufruftest:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim h As New HexConverter
    2. Dim b() As Byte = System.Text.Encoding.ASCII.GetBytes("ABC")
    3. If h.Convert(b) <> "414243" Then
    4. MessageBox.Show("ups, no go!")
    5. Exit Sub
    6. End If
    7. Dim stp As New Stopwatch
    8. Dim r As New Random
    9. Dim i As Integer = 16 * 1024 * 1024
    10. Dim ba(i) As Byte
    11. Do
    12. ba(i) = r.Next(0, 256)
    13. i -= 1
    14. Loop Until i = 0
    15. Dim s As String
    16. stp.Start()
    17. For i = 1 To 10
    18. s = h.Convert(ba)
    19. Next
    20. stp.Stop()
    21. Debug.Print(stp.ElapsedMilliseconds / 10)


    Output: 650

    Also 650 ms, um 16 MB Bytes in einen "Hex"-String zu konvertieren.

    Nachtrach;
    ein hexeditor(Beispielsweiße) schafft so etwas ja auch schneller.

    Fail!
    Ein Hex-Editor konvertiert nur die SICHTBAREN Bytes (80*40 -> 3200) in String. DAS geht flotto-tutti!