none
Optimisation de lecture de fichier texte RRS feed

  • Discussion générale

  • Ci dessous un petit bout de code qui lit un tableau de string pour récupérer des données dans un fichier texte.

    Malheureusement, entre chaque sélection de valeurs coïncidant avec le filtre de la boucle foreach, il se passe 500ms. J'ai 112600 valeurs a retrouvé, ce qui donne 15h d’exécution ... 

    Un conseil pour accélérer la boucle ?

    foreach (string FileName in fileFastPath)
                {
                   var start = DateTimeOffset.UtcNow;
                    var allLines = File.ReadAllLines(FileName);
     
                    foreach (var line in allLines.Where(line => line.Contains("Acquisition depuis")))
                    {
                        DateTimeOffset.TryParse(line.Split('\t')[1], out start);
                    }
     
                    double x = 0, y = 0, z = 0;
     
                    foreach (var (sp1, sp2, vear, milliseconds) in from line in allLines
                                                                   where !line.Contains("Acquisition depuis")
                                                                   select line.Split('\t') into values
                                                                   where values.Length >= 5
                                                                   where double.TryParse(values[3], out x)
                                                                   where double.TryParse(values[4], out y)
                                                                   where double.TryParse(values[5], out z)
                                                                   let milliseconds = double.Parse(values[0])
                                                                   where milliseconds % 1000 == 0
                                                                   select (x, y, z, milliseconds))
                    {
                        var updatedStart = start + TimeSpan.FromMilliseconds(milliseconds);
                        var existingValue = Data
                            .Select($"Time = #{updatedStart: yyyy-MM-dd HH:mm:ss.fff}#")
                            .FirstOrDefault(existing => existing != null);
     
                        if (existingValue != null)
                        {
                            existingValue["SP1 Bar"] = sp1;
                            existingValue["SP2 Bar"] = sp2;
                            existingValue["VEAR_POS %"] = vear;
                        }
                    }               
                }


    vendredi 24 novembre 2017 19:14