2016-06-14 21 views
1

ノートパソコンには約200のテキストファイルがあります。これらのテキストファイルを1行ずつ読み込み、FTPサーバーの各行ごとにディレクトリを作成するコードをC#で作成しました。これを行うには、他のより高速な方法があるFTPで複数の空のディレクトリを高速に作成

static void Main() 
{ 
    for (int i = 0; i <= 200; i++) 
    { 
     var lines = File.ReadAllLines(@"D:\file_" + i.ToString().PadLeft(5, '0') + ".txt"); 
     foreach (var line in lines) 
     { 
      try 
      { 
       WebRequest request = WebRequest.Create("ftp://myftp/dir/" + line); 
       request.Method = WebRequestMethods.Ftp.MakeDirectory; 
       request.Credentials = new NetworkCredential("user", "pass"); 
       request.GetResponse(); 
      } 
      catch (Exception ex) 
      {} 
     } 
    } 
} 

しかし、これはディレクトリを作成することは非常に遅いです:

は、これは私のコードですか?たとえば、テキストファイルを配列として取得し、すべてのディレクトリを作成します。

+2

プログラムの遅い部分は、確かにあなたのテキストファイルの読み込みではありません。 – nvoigt

答えて

0

あなたのプログラムの遅い部分は、あなたが1つずつ送信しているリクエストです。 あなたはそれらをスピードアップするためにいくつかのトリックを行うことができます:あなたはそれが終了されるまで、すべての要求を待つ必要はありませんので、

// allow more connections at a time 
ServicePointManager.DefaultConnectionLimit = 30; 
// don't wait the 100ms every request do 
ServicePointManager.Expect100Continue = false; 

さらにあなたは、マルチスレッドにリクエストを送信することができます。しかし、多くの要求がサーバーをダウンさせる可能性があることに注意してください。 200は問題ではありません。問題ではない、実際にテキストファイルの

static void Main() 
{ 
    // allow more connections at a time 
    ServicePointManager.DefaultConnectionLimit = 30; 
    // don't wait the 100ms every request do 
    ServicePointManager.Expect100Continue = false; 

    List<Task> tasks = new List<Task>(); 

    for (int i = 0; i <= 200; i++) 
    { 
     var lines = File.ReadAllLines(@"D:\file_" + i.ToString().PadLeft(5, '0') + ".txt"); 
     foreach (var line in lines) 
     { 
      tasks.Add(Task.Run(() => 
       { 
        try 
        { 
         WebRequest request = WebRequest.Create("ftp://myftp/dir/" + line); 
         request.Method = WebRequestMethods.Ftp.MakeDirectory; 
         request.Credentials = new NetworkCredential("user", "pass"); 
         request.GetResponse(); 
        } 
        catch (Exception ex) 
        { } 
       } 
      )); 
     } 
    } 

    Task.WaitAll(tasks.ToArray()); 
} 
1

読書されています。ここでは

あなたがテストすることができ、いくつかのコードを持っています。遅い部分はFTPです。 parallelize the processing

使用多くのスレッド:あなたもWebResponse年代を配置するの世話をする必要があります

List<Task> tasks = new List<Task>(); 

for (int i = 0; i <= 200; i++) 
{ 
    tasks.Add(new Task(() => 
     { 
      var lines = 
       File.ReadAllLines(@"D:\file_" + i.ToString().PadLeft(5, '0') + ".txt"); 

      foreach (var line in lines) 
      { 
       WebRequest request = WebRequest.Create("ftp://myftp/dir/" + line); 
       request.Method = WebRequestMethods.Ftp.MakeDirectory; 
       request.Credentials = new NetworkCredential("user", "pass"); 
       request.GetResponse(); 
      } 
     } 
    )); 
} 

Task.WaitAll(tasks.ToArray()); 

けれどもノート。

関連する問題