4

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");
        }
    }
4

2 に答える 2

10

デスクトップシステム上のFTPの場合、約256Kbのブロックサイズがテストで最高のパフォーマンスを生み出しました。バッファサイズが小さいと、転送速度が大幅に低下します。自分で測定することをお勧めしますが、20Kbはバッファーには絶対に少なすぎます。

于 2012-06-03T16:29:34.793 に答える
0

ファイルはすでにファイルシステムキャッシュによってバッファリングされています。20KB未満のものを使用する必要があります。4 KBは従来の選択であり、私は実際には4KBより低くなることはありません。キロバイトを下回らないでください。16KBを超えるとメモリが無駄になり、CPUのL1キャッシュ(通常は16または32 KBのデータ)に不向きになります。

ハンス(https://stackoverflow.com/a/3034155

Use 4 KB (AKA 4096 b)

.Net 4.5では、デフォルト値が81920バイトに増加し、.Net Reflectorを使用すると、_DefaultCopyBufferSizeの値が0x14000(81920b、または80K)であることが示されます。ただし、これはストリームからストリームにコピーするためのものであり、データをバッファリングするためのものではありません。BufferedStreamクラスの_DefaultBufferSizeは0x1000(4096bまたは4k)です。

于 2015-10-27T02:56:58.240 に答える