none
Azure Functions: Verarbeiten einer Textdatei

    Frage

  • Hallo,

    ich habe eine eigentlich sehr übersichtliche Function geschrieben. Aufgabe ist nu, eine eingehende Textdatei (in diesem Falle über OneDrive, ich weiss, experimentell) Zeile für Zeile in eine Queue zu schreiben. Der Overhead im Code ist eigentlich sehr überschaubar. Bei wenigen Zeilen funktioniert das alles wunderbar. Bei einem Test unter Produktivbedingungen schlägt aber der Timeout nach 5 Minuten erbarmungslos zu. Es sind dann etwas 3/4 der Datei verarbeitet. Die Datei ist eine CSV mit ~4200 Zeilen und insgesamt 638KB. Also nicht wirklich ein 'Monster'.

    using System;
    
    public static void Run(string inputFile, string name, TraceWriter log, ICollector<string> outputSbQueue)
    {
        int Counter = 0;
        Guid UniqueID = Guid.NewGuid();
    
        log.Info($"File processed: {name} {UniqueID}");
    
        // Split lines
        try
        {
            string[] lines = inputFile.Split('\n');
    
            // Loop per line
            foreach (string line in lines)
            {
                // Skip first line
                if (Counter++ > 0 && line.Trim() != string.Empty)
                {
                    outputSbQueue.Add(string.Format("{0};{1};{2}", UniqueID, name, line));
                }
            }
        }
        catch (Exception ex)
        {
            log.Error($"Some error occured: {ex.Message}.");
        }
    }
    

    Hat jemand einen Tipp, wo ich was besser machen könnte oder was hier in der Verarbeitung so lange braucht? Könnte vielleicht der experimentelle Zustand der OneDrive Anbindung das Problem dastellen und gar nicht die Implementierung ansich?

    Bin für jeden Hinweis dankbar :)


    Dienstag, 10. Januar 2017 14:02

Antworten

  • Guten morgen,

    der Timeout (5 Minuten) ist bei AzureFunctions festgelegt und kann wohl auch nicht geändert werden; eine FUnction darf also nur eine maximale Laufzeit von 5 Minuten haben.

    Meinen Code von oben habe ich nochmals angepasst und aus dem foreach eine for (int i...) gemacht, was erst mal nichts brachte, dadurch aber die Abfrage auf den Counter wegfiel (erste Zeile überspringen) und zudem dann auch das if für Leerzeilen geändert habe (if(line == string.Empty) continue;), wodurch zumindest mal der Testlauf mit einer aktuellen Textdatei aus Produktion deutlich innerhalb des Timeouts durchlief, ergo erfolgreich war.

    Das Problem ist somit erst einmal umgangen, dennoch ist es u.U. nur eine Frage der Zeit (besser: Anzahl Zeilen in Textdatei), bis es wieder auftreten kann. Eventuell ist dann eine AzureFunction doch der falsche Ansatz; ich bin mir aber nicht sicher inwiefern ich hier z.B. mit einer LogicApp besser fahre. Vielleicht wäre es auch eine Alternative, die Verarbeitung pro Zeile, sprich das Schreiben in die Queue asynchron anzustossen... (Zur Vollständigkeit: outputSbQueue ist ein AzureServiceBus.)

    Nichtsdestotrotz. Erst mal danke für die Unterstützung.

    Christoph Biegner

    Montag, 16. Januar 2017 08:08

Alle Antworten

  • Hi,
    ich würde die Daten aus OneDrive erst einmal zeilenweise in eine List Of String "kopieren". Danach ist die Verbindung zu OneDrive zu schleißen und es kann auch kein TimeOut mehr auftreten. Und erst danach wird outputSbQueue.Add ausgeführt.

    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Dienstag, 10. Januar 2017 21:00
  • Hallo,

    mit string[] lines = inputFile.Split('\n'); kopieren ich den Inhalt zwar nicht in eine List<string>, aber das Array wird doch auch nicht langsamer sein in der Verarbeitung, oder?

    Das Timeout kommt ja auch nicht von der offenen Verbindung zu OneDrive, sondern durch die 4000+ Elemente im Array, die abgearbeitet werden müssen, was dann offensichtlich länger dauert, als die maximale Laufzeit einer Azure Function (5 Minuten).

    In einer ersten Version hatte ich noch mehr Logik in der Function; mittlerweile sehe ich aber nicht, wo ich da noch etwas wegnehmen sollte. Da frage ich mich dann aber schon, wie man in einer Function mit größeren Dateien umgehen kann...

    Viele Grüße

    Christoph 

    Mittwoch, 11. Januar 2017 06:39
  • Hi Christoph,
    wenn das TimeOut nicht vom Lesen des InputFile kommt, dann bleibt nur "ICollector<string> outputSbQueue" übrig. Was nutzt Du da konkret und welches TimeOut ist für diesen Service eingestellt? 

    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks


    Mittwoch, 11. Januar 2017 11:55
  • Guten morgen,

    der Timeout (5 Minuten) ist bei AzureFunctions festgelegt und kann wohl auch nicht geändert werden; eine FUnction darf also nur eine maximale Laufzeit von 5 Minuten haben.

    Meinen Code von oben habe ich nochmals angepasst und aus dem foreach eine for (int i...) gemacht, was erst mal nichts brachte, dadurch aber die Abfrage auf den Counter wegfiel (erste Zeile überspringen) und zudem dann auch das if für Leerzeilen geändert habe (if(line == string.Empty) continue;), wodurch zumindest mal der Testlauf mit einer aktuellen Textdatei aus Produktion deutlich innerhalb des Timeouts durchlief, ergo erfolgreich war.

    Das Problem ist somit erst einmal umgangen, dennoch ist es u.U. nur eine Frage der Zeit (besser: Anzahl Zeilen in Textdatei), bis es wieder auftreten kann. Eventuell ist dann eine AzureFunction doch der falsche Ansatz; ich bin mir aber nicht sicher inwiefern ich hier z.B. mit einer LogicApp besser fahre. Vielleicht wäre es auch eine Alternative, die Verarbeitung pro Zeile, sprich das Schreiben in die Queue asynchron anzustossen... (Zur Vollständigkeit: outputSbQueue ist ein AzureServiceBus.)

    Nichtsdestotrotz. Erst mal danke für die Unterstützung.

    Christoph Biegner

    Montag, 16. Januar 2017 08:08