C#:FTP上载缓冲区大小

C#:FTP上载缓冲区大小,c#,upload,ftp,io,buffer,C#,Upload,Ftp,Io,Buffer,我已经去FTP上传功能,但有一些事情,我想问一下 这是缓冲区大小,我将它设置为20KB,这意味着什么?如果我增加/减少它,会有什么不同吗 private void Upload(string filename) { FileInfo fi = new FileInfo(filename); FtpWebRequest ftp = (FtpWebRequest)FtpWebRequest.Create("ftp://" + textBox1.Tex

我已经去FTP上传功能,但有一些事情,我想问一下 这是缓冲区大小,我将它设置为20KB,这意味着什么?如果我增加/减少它,会有什么不同吗

    private void Upload(string filename)
    {
        FileInfo fi = new FileInfo(filename);

        FtpWebRequest ftp = (FtpWebRequest)FtpWebRequest.Create("ftp://" + textBox1.Text + "/" + Path.GetFileName(filename));
        ftp.Credentials = new NetworkCredential(textBox2.Text, textBox3.Text);
        ftp.Method = WebRequestMethods.Ftp.UploadFile;
        ftp.UseBinary = true;
        ftp.KeepAlive = false;
        ftp.ContentLength = fi.Length;

        // The buffer size is set to 20kb
        int buffLength = 20480;
        byte[] buff = new byte[buffLength];
        int contentLen;

        //int totalReadBytesCount = 0;

        FileStream fs = fi.OpenRead();

        try
        {
            // Stream to which the file to be upload is written
            Stream strm = ftp.GetRequestStream();

            // Read from the file stream 2kb at a time
            contentLen = fs.Read(buff, 0, buffLength);

            // Till Stream content ends
            while (contentLen != 0)
            {
                // Write Content from the file stream to the 
                // FTP Upload Stream
                strm.Write(buff, 0, contentLen);
                contentLen = fs.Read(buff, 0, buffLength);
            }

            // Close the file stream and the Request Stream
            strm.Close();
            fs.Close();

        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "Upload Error");
        }
    }

对于桌面系统上的FTP,大约256Kb的块大小在我们的测试中产生了最好的性能。较小的缓冲区大小会显著降低传输速度。我建议您自己进行一些测量,但是20Kb对于缓冲区来说肯定太小了

文件已被文件系统缓存缓冲。你应该使用 小于20KB的东西。4KB是一个传统的选择,我真的 不会低于4KB。不要低于1千字节,超过16千字节 KB是一种内存浪费,对CPU的一级缓存不友好 (通常为16或32 KB的数据)

汉斯()

使用4KB(又名4096B)


在.Net 4.5中,他们将默认值增加到81920字节,并且使用.Net反射器显示_DefaultCopyBufferSize的值为0x14000(81920b或80K)。然而,这是为了从一个流复制到另一个流,而不是缓冲数据。BufferedStream类的_DefaultBufferSize为0x1000(4096b或4k)。

您能解释一下为什么选择20KB以下的缓冲区吗?这使得传输非常慢!甚至微软也默认为4KB如果使用包装好的MS
FtpPutFile()
实际上您将使用4KB的缓冲区大小。不确定为什么我的答案是错误的(你会觉得有必要否决),如果它是构建在框架中的东西…还补充了我答案的来源。很多人似乎同意我的答案作为旁注,我还发送了一些小文件(40KB左右),这些文件对我来说非常有用。如果你有更大的文件,我想你会希望使用更大的缓冲区来获得最佳性能。没问题@Toshi.)我无法相信这对我的SFTP应用程序有多大的影响。非常感谢你!