2017-01-12 3 views
-1

Ich schreibe ein Programm, wo es einen Ordner mit sehr vielen Dateien (mehr als tausend) gibt. Ich möchte einen effizienten Weg, "öffnen Sie jede Datei und verarbeiten sie. Verarbeitung umfasst den Aufruf einer Datenbank Stored Procedures auf den Inhalt des file.I je haben den folgenden Code zu lesen, den Inhalt jeder file.Please lassen Sie mich geschrieben wissen, ob eine Verbesserung oder alternative Optionen.Verarbeitung einer großen Anzahl von Dateien C#

using System; 
using System.Collections.Generic; 
using System.Diagnostics; 
using System.IO; 
using System.Security; 
using System.Threading; 
using System.Threading.Tasks; 
using System.Text; 
using System.Collections; 

class Program 
{ 
    static void Main() 
    { 
     ProcessRead().Wait(); 
     Console.Write("Done "); 
     Console.ReadKey(); 
    } 

    static async Task ProcessRead() 
    { 
     var sw = Stopwatch.StartNew(); 
     string folder = @"Directory"; 

     string[] fileEntries = Directory.GetFiles(folder); 
     int count = 0; 

     foreach (string fname in fileEntries) 
     { 
      if (File.Exists(fname) == false) 
      { 
       Console.WriteLine("file not found: " + fname); 
      } 
      else 
      { 
       try 
       { 
        count++; 
        string text = await ReadTextAsync(fname); 
        Console.WriteLine(text); 
       } 
       catch (Exception ex) 
       { 
        Console.WriteLine(ex.Message); 
       } 
      } 
     } 
     Console.WriteLine("Elapsed Time" + sw.ElapsedMilliseconds); 
     Console.WriteLine(count); 
    } 

    static async Task<string> ReadTextAsync(string filePath) 
    { 
     using (FileStream sourceStream = new FileStream(filePath, 
      FileMode.Open, FileAccess.Read, FileShare.Read, 
      bufferSize: 4096, useAsync: true)) 
     { 
      StringBuilder sb = new StringBuilder(); 

      byte[] buffer = new byte[0x1000]; 
      int numRead; 
      while ((numRead = await sourceStream.ReadAsync(buffer, 0, buffer.Length)) != 0) 
      { 
       string text = Encoding.UTF8.GetString(buffer, 0, numRead); 
       sb.Append(text); 
      } 

      return sb.ToString(); 
     } 
    } 
} 
+7

Da dies funktioniert Code, der Sie einen Kommentar zu wollen, werden Sie mehr Glück über an [Code Review] (http://codereview.stackexchange.com) haben - aber bitte verbringen ein wenig Zeit, um Ihren Code richtig zu formatieren und vorher zu posten. – Rob

+2

Ja, Code Review ist eine bessere Anlaufstelle. Stellen Sie sicher, dass Sie den Code einschließen, der die gespeicherte Prozedur aufruft, andernfalls können sie keine Antwort geben (und die Frage wird möglicherweise geschlossen). – Alexei

+3

Ich stimme für das Schließen dieser Frage als Off-Topic ab, da sie Code Review Stackexchange gehört. –

Antwort

0

Es hängt von vielen Parametern kann wie als Dateigröße ... aber Sie können vermeiden, StringBuilder mit dem folgenden Code anhängen und überprüfen, ob es eine bessere Leistung für Sie hat:

byte[] data; 
int n; 

using (FileStream sourceStream = File.Open(filename, FileMode.Open)) 
{ 
    n = (int)sourceStream.Length; 
    data = new byte[n]; 
    await sourceStream.ReadAsync(result, 0, n); 
} 

return Encoding.UTF8.GetString(data, 0, n); 

Sie können auch FileOptions.Asynchronous | FileOptions.SequentialScan verwenden, wenn Sie den FileStream öffnen. Das SequentialScan-Flag zeigt an, dass auf die Datei sequenziell von Anfang bis Ende zugegriffen werden soll. Das System kann dies als Hinweis verwenden, um das Datei-Caching zu optimieren.

siehe auch this link

Verwandte Themen