0

FTPからファイルをダウンロードしてから別のFTPの場所にアップロードするコンソールアプリを作成しました。ファイルのダウンロードには約10秒かかりますが、アップロードには約6分かかります。サイズが約5〜30KBの256個のファイルがあります。とても小さいです。

アップロードとダウンロードのコードは非常によく似ており、ディレクトリ内のすべてのファイルを繰り返し処理してからアップロードします。以下に示すように、これはかなり単純で、D:\LEV\フォルダーからftpにファイルを繰り返しアップロードします。

編集:これはAzureの「小さな」Windows仮想マシンで実行されるので、帯域幅は問題ではないと思いますか?また、Windows ftp.exeを使用してアップロードする別の仮想マシンで同じタスクを実行しており、同じマシン上のコンソールアプリよりも2倍高速です。

なぜそれがとても遅いのか、または速度を改善する方法はありますか?

static public void Upload(string file1)
{        
    string upftpServerIP = "ftp://ftp.domain.co.uk/lev/";
    string upftpUserID = "username";
    string upftpPassword = "password";

    string uri = upftpServerIP + file1;
    Uri serverUri = new Uri(uri);
    if (serverUri.Scheme != Uri.UriSchemeFtp)
    {
       return;
    }
    FtpWebRequest reqFTP;
    reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(upftpServerIP + file1));
    reqFTP.Credentials = new NetworkCredential(upftpUserID, upftpPassword);
    reqFTP.KeepAlive = false;
    reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
    reqFTP.UseBinary = true;
    reqFTP.Proxy = null;
    reqFTP.UsePassive = true;

    Console.WriteLine("Uploading " + file1);

    FileStream fs = File.OpenRead(@"D:\LEV\" + file1);
    byte[] buffer = new byte[fs.Length];
    fs.Read(buffer, 0, buffer.Length);
    fs.Close();
    Stream ftpstream = reqFTP.GetRequestStream();
    ftpstream.Write(buffer, 0, buffer.Length);
    ftpstream.Close();
}

static public string[] GetFileListUpload()
{
    string[] uploadFiles = Directory.GetFiles(@"D:\LEV\", "*.*", SearchOption.TopDirectoryOnly);
    return uploadFiles;
}
4

1 に答える 1

5

ここで考慮すべき要素がいくつかあります。

  • インターネット接続が対称であるとは限りません。ほとんどのインターネット接続プラン (少なくとも私の地域では) は、ダウンロード帯域幅の 1/8 のアップロード帯域幅を提供します。

  • FTP サーバー自体が、着信接続の帯域幅を制限している可能性があります。

  • FTP サーバーは、アップロードごとの最大帯域幅を調整している場合もあります。この場合、アップロードをマルチスレッド化し、一度に多くのファイルをアップロードすると、大きなメリットが得られます。

于 2012-12-25T14:57:05.307 に答える