Streamreader -> Datei via Netzlaufwerk -> Nicht schneller als 50mbit/s

  • VB.NET

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

    Streamreader -> Datei via Netzlaufwerk -> Nicht schneller als 50mbit/s

    Hallo Zusammen,

    ich habe da ein kurioses Problem, welchem ich nicht ganz so gewahr werde.

    Ich habe eine Anwendung Programmiert, welche per "Streamreader" mehrere Dateien nacheinander ausliest. Die Dateien befinden sich auf einem Server im internen Netzwerk. Via Netzlaufwerk greift das Programm dann auf den Ordner zu.

    Starte ich das Programm auf meinem Laptop habe ich eine Netzwerkgeschwindigkeit (Task-Manager) von ca. 500Mbit/s. <- Entsprechend schnell ist auch das auslesen der Datei.

    Auf einem Server bei uns habe ich dieses Programm ebenfalls laufen -> Netzwerkgeschwindigkeit kommt nicht über 50mbit/s.
    Auf dem gleichen Server läuft noch ein anderes Programm, welches auf das selbe Netzlaufwerk zugreift und ebenfalls Dateien ausliest -> 500mbit/s
    Kopiere ich eine Datei manuell vom Netzlaufwerk auf den Server -> 500 mbit/s

    Starte ich mein Programm auf dem Server -> Wieder nur 50 mbit/s

    Gibt es da irgendeine Einstellung die ich nicht berücksichtigt habe ? ?(

    Ich verstehe gerade echt nicht wo das her kommt.

    Danke
    Das "mandantenverzeichnis" zeigt auf zb: "O:\". Welches dann ein einfaches eingebundenes Netzlaufwerk ist

    VB.NET-Quellcode

    1. Dim dt As New DataTable
    2. Dim Datei As String = mandantenverzeichnis & "IDB_ID0800.DAT"
    3. Dim st As New System.IO.FileStream(Datei, IO.FileMode.Open, FileAccess.Read, FileShare.ReadWrite)
    4. Dim reader As StreamReader = New StreamReader(st, System.Text.Encoding.GetEncoding("Windows-1252"), False)
    5. dt.Columns.Add("id")
    6. dt.Columns.Add("Aid")
    7. reader.ReadLine()
    8. Do While reader.Peek >= 0
    9. Dim line As String = reader.ReadLine
    10. Dim r As DataRow = dt.NewRow
    11. 'Hier findet dann die Zuweisung statt. Die habe ich jetzt mal raus genommen zur besseren Übersicht. Ist ja nichts besonderes
    12. Loop
    13. 'Und alles wieder schließen
    14. reader.Close()
    15. st.Close()
    16. Return dt
    Ein Versuch wäre, vor der Schleife ein ReadAllLines zu setzen und die Daten aus dem Memory zu verarbeiten.

    VB.NET-Quellcode

    1. ​Dim dt As New DataTable
    2. dt.Columns.Add("id")
    3. dt.Columns.Add("Aid")
    4. Dim Datei As String = mandantenverzeichnis & "IDB_ID0800.DAT"
    5. Dim Lines = System.IO.ReadAllLines(Datei)
    6. For Each Line In Lines
    7. Dim r As DataRow = dt.NewRow
    8. '...
    9. Next
    10. Return dt
    Ist das schneller?
    Vor allem: Ist der Kopiervorgang an sich (Zeile 5) schneller?
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Du könntest es dennoch mal testen.
    Dann weißt du, ob das Netzwerk Probleme macht oder die Verarbeitung.
    Ich könnte mir auch vorstellen, dass das reader.Peek übers Netz zusätzliche Zeit verschwendet, die du lokal gar nicht merkst.

    Wenn du nur lesen musst, könnte eine Variante auch sein, die Datei mit CopyFile auf ein lokales Temp-Verzeichnis zu kopieren und von dort zu verarbeiten.
    Auch das würde ich in den Performance-Test mit einbeziehen.

    Wichtig ist, dass du erst mal rauskriegst, wo der Flaschenhals tatsächlich ist.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Okay klar Testen kann ich das natürlich.
    Aber nur das wir nicht aneinander vorbei reden:

    Wenn ich die Datei zuerst in ein lokales Verzeichnis kopiere -> 1,5 Gb und mehr. Dauert der Kopier Vorgang länger als das Auslesen selber.

    Vielleicht nochmal zum Verständnis:

    -Mein Laptop (Windows 10) -> Netzlaufwerk auf Server A wo die Datei liegt -> Datei wird ausgelesen und erzeugt eine Netzwerkauslastung von ca. 500Mbit/s und braucht für das Auslesen 5 Sekunden

    -TestPC (Windows 10) -> Netzlaufwerk auf Server A wo die Datei liegt -> Datei wird ausgelesen und erzeugt eine Netzwerkauslastung von ca. 500Mbit/s und braucht für das Auslesen 5 Sekunden

    -Virtuelle Machine (Windows 10) auf einem ESX Host -> Netzlaufwerk auf Server A wo die Datei liegt -> Datei wird ausgelesen und erzeugt eine Netzwerkauslastung von ca. 50Mbit/s und braucht für das Auslesen 60 Sekunden
    (Bei der Virtuellen Maschine gibt es noch ein anderes Programm welches durchaus in der Lage ist eine Netzwerkauslastung von 500Mbit/s zu erzeugen)



    Hier stellt sich halt die Frage ob es eventuell an irgendwelchen Einstellungen in den Projekteigenschaften liegen kann, die eventuell für ein Blocken der Netzwerkauslastung sorgen könnten.
    Ich kann mir halt nur ganz schwer vorstellen, dass es am Sourcecode liegt, wenn auf 2 Maschinen alles sauber läuft aber auf der dritten nicht.
    Es gibt ja z.B. in Windows diesen schönen Dienst "Antimalware Service Executable". Hier wird nämlich der gesamte Netzwerktraffic drüber geleitet, den mein Tool verursacht.