CSV Datei Zeilen zählen - extrem schnell - GNUWin32

  • Wenn die Kodierung außer Acht gelassen wird und nur Byteweise nach 0D oder 0A gesucht wird werden so diese fälschlicherweise als Zeilenende erkannt.

    Da haben wir klassisch aneinander vorbeigeredet :D
    010D enthält ein Zeichen, welches im ASCII-Bereich als Steuerzeichen gilt. Enthält ein Text (!) Dateiinhalt solch ein Zeichen, dann ist dieser UTF8-kodiert, wenn 000D auch UTF16.
    Genau daher müssen diese Inhalte analysiert werden, um die Kodierungen zu erkennen.
    Im ASM-Code habe ich es mir einfach gemacht und nur nach einem Zeichen gesucht. Ob CR oder LF ist unerheblich, man könnte auch die Anzahl aller "e" ermitteln.(letzter Parameter im DllCallAddress).
    Man könnte den Code noch dahingehend erweitern, erst nach allen Zeichen unterhalb ASCII 31 zu schauen, wenn solch ein Zeichen vorkommt, dann "könnte" eine UTF8/16-Kodierung vorliegen und dann müsste entsprechend ausgewertet werden. Aber wer sagt, dass nicht eine EXE-Datei in eine Textdatei umbenannt wurde....
    Lade mal eine ausführbare Datei in Scite, dann weißt du, worauf ich (nicht :P ) hinaus will!


    Ich werde mal gesamte Verzeichnisse einlesen, bei hunderten unterschiedlicher Dateien sollte sich ein plausibler Mittelwert ergeben.

    Naja, mit den 100MB/s hab ich nicht mal schlecht geschätzt.
    Ich habe meinen "C:\"-Ordner rekursiv durchsucht aber nur alle Dateien zwischen 60 und 400MB eingelesen. Dabei sind interessante Sachen herausgekommen.
    Es gibt definitiv von Windows gecachte bzw. im Arbeitsspeicher stehende Dateien, diese haben bei Größen um die 330MB nur Lesezeiten im Millisekundenbereich, da wurde seitens System (ReadFile) einfach nur der Speicher gemapped, was zu "Leseraten" von 1GB/s führt. Das ist im Speichertransfer realistisch.
    Dann gibt es Dateien, die haben 80 bis 100MB und werden in einer Sekunde eingelesen, auch realistische Transferzeiten von 80 bis 100MB/s.
    Der überwiegende Teil der Dateien bewegt sich bei ca. 30-90MB/s. Im Schnitt erreiche ich 66MB/s.
    Bei "kaltem" Rechner, also direkt nach dem Aufwachen aus dem Schlafmodus und niedriger Prozessor/Platten-Temperatur erreiche ich bei sonst gleichen Voraussetzungen 88 MB/s...das sind Abweichungen von 20-30%!!!!

    Um nicht den schon angesprochenen "AutoIt-Speicher-Schiebe-Malus" einzurechnen, habe ich nur die reinen Transferzeiten von "Platte" nach "RAM" ermittelt (s. auskommentiertes Return in _TextFileRead() ).
    AspirinJunkies _FileReadFast() gibt auch Strings zurück, daher dauerts auch so lange...
    Wer mag, kann ja mal AspirinJunkies Funktion mit AutoIt-FileRead vergleichen.... :theke:

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    Einmal editiert, zuletzt von Andy (22. März 2016 um 07:55)