Große menge an Dateien einlesen

  • VB.NET

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

    Große menge an Dateien einlesen

    Hallo,
    ich habe das Problem dass mein geschriebenes Programm sehr viele Dateien auf einmal einlesen und in einem Array speichern muss.
    Nun ist die Frage ob ich die Anzahl Dateien die GetFiles einliest begrenzen kann

    Hier der Teil meines Codes der für das einlesen zuständig ist.

    VB.NET-Quellcode

    1. pfad = Application.StartupPath
    2. If Not pfad.EndsWith("\") Then pfad = pfad & "\"
    3. X = 0
    4. file = Directory.GetFiles(pfad, "*.log")


    hat jemand eine Idee wie ich GetFiles sagen kann dass es nur eine bestimmte Anzahl Dateien einlesen soll? z.B. 100
    @TyRiiT
    1. Zitiere bitte nicht den Post über Deinem Post.
    2. Dein Programm-Design scheint etwas aus dem Ruder geraten zu sein.
      Kannst Du bitte mal scheiben, was überhaupt Du vorhast?
    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
    ich bin dabei ein Programm zu schreiben dass, in einem intervall mehrere hundert .log Dateien (Inhalt: Request(jeweils ein Textblock und ein XML Code) und Response(ein Textblock und ein XML Code)) in 4 Dateien auf teilen, dann jede Zeile des Textes und bestimmte XML knoten in eine MySQL Datenbank schreiben soll. Der Hintergrund ist dass innerhalb von 10 Minuten ~30-50 .log Dateien erstellt werden und die Festplatte nicht vollaufen darf. Und da es passieren kann dass mehrere tausend .log Dateien erstellt werden meine Frage: wie kann ich eine begrenzte Anzahl an Dateien einlesen?
    Das Programm soll wenn es fertig ist im Hintergrund auf einem Server laufen. Meine Sorge ist halt dass wenn ich mit getfiles arbeite die Explorer.exe überlastet werden könnte (wie gesagt es könnte passieren dass mehrere tausend .log Dateien in dem Ordner liegen)

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

    @TyRiiT Aha.
    Ist gesichert, dass Du Dateien öffnest, die nicht noch einmal beschrieben werden? Ansonsten hast Du einen größeren Aufwand, partiell ausgewertete Dateien final auszuwerten.
    Wie groß sind die Dateien? Kann man sie in einem Rutsch einlesen oder nur sequentiell?
    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
    der Ablauf ist wie folgt: die Dateien werden von einem DMS in einen log Ordner geschrieben. Alle 5 min. kopiert eine Batch alle Dateien in diesem Ordner auf einen anderen Server. In dem Ordner in den die Dateien reinkopiert werden liegt mein Programm dass dann wieder die Dateien weiter verarbeiten soll.
    Also ja es ist gesichert dass keine Dateien geöffnet werden die gerade beschrieben werden.

    die Dateien sind Höchstens 50 KB groß jedoch sind es wie gesagt sehr viele. ich kann die Dateien ohne Probleme komplett einlesen.

    TyRiiT schrieb:

    Meine Sorge ist halt dass wenn ich mit getfiles arbeite die Explorer.exe überlastet werden könnte
    Ich glaub nicht, dass die Explorer.exe beleidigt ist, weil du die Datei-Informationen eines großen Ordners abrufst.
    Beachte nochmal den Code in post#2 (EnumerateFiles - nicht GetFiles!): da wird kein Array zurückgegeben, sondern ein IEnumerable, also etwas, was die Daten lazy evaluiert.
    Damit ist glaub auch die Idee, nur 100 Dateien abzurufen vom Tisch, denn bei lazy Evaluation kannst du auch 10000 Dateien abrufen - es wird dir eh immer nur eine nach der anneren geliefert, und das "stört keinen großen Geist" (Karlsson vom Dach)
    Ich hätte bei dem Teil eher Sorge, zu erkennen, welche Dateien abgearbeitet sind, und welche nicht.
    Auch muss untersucht werden, was diese fabelhafte lazy evaluierung macht, wenn währenddessen neue Dateien auflaufen - werden die noch ergriffen, oder nur das, was beim Start von .EnumerateFiles vorhanden war?
    Und kann man abgearbeitete Dateien löschen, während die Evaluierung läuft? Ohne dass da iwas durcheinander kommt?
    Also wenn du Glück hast ist alles ganz einfach, aber mein Händchen täte ich da nicht für ins Feuer.
    in meinem Programm Code verschiebe ich im Moment die Dateien in einen Unterordner der wiederrum am anfang der schleife erstellt wird. Somit ist versichert dass keine Datei doppelt bearbeitet wird.

    ich würde wiederum mit einem Timer arbeiten der alle 5 - 10 min die überprüft ob neue Dateien dazu gekommen sind.

    die abgearbeiteten Dateien sollen sogar am ende Gelöscht werden. Das Ziel des Programms ist es ja bestimmte Daten in eine DB zu schreiben sodass die Festplatte nicht mit Millionen von 50 KB großen .Log files vollläuft.

    Vielen Dank schonmal für die Hilfe !

    TyRiiT schrieb:

    ob neue Dateien dazu gekommen sind.
    Dafür gibt es einen FileSystemWatcher. Der generiert ein Event, wenn z.B. eine neue Datei vorhanden ist.
    Wenn Du beginnst, fräse Dich durch alle Dateien durch und verschieb oder lösch die bearbeiteten. Wenn das Verzeichnis leer ist, lass Dich vom geeigneten Event wecken.
    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!