提高应用程序效率的最佳缓冲区大小是多少?

时间:2018-02-16 10:01:31

标签: c# file-io buffer filestream memorystream

我有一个应用程序,它读取文件并复制其内容并写入另一个文件。 我正在使用缓冲区来读取文件并写入另一个文件。

当文件更多时,应用程序需要很长时间。

是否有任何特定的最佳缓冲区大小值可用于提高应用程序的效率?

我使用256KB作为最大缓冲区大小。

在Parallel.ForEach循环中调用Next方法。

以下是代码:

private bool Upload(string address, string uploadFile, string user, string password, string clientLogFile)
    {
        // Get the object used to communicate with the server. 
        FtpWebRequest request = null;
        try
        {
            request = (FtpWebRequest)WebRequest.Create(address);
            request.Credentials = new NetworkCredential(user, password);
            request.Method = WebRequestMethods.Ftp.UploadFile;
            request.KeepAlive = false;
            request.Timeout = Convert.ToInt32(ConfigurationSettings.AppSettings["timeout"]);

            request.UsePassive = Convert.ToBoolean(ConfigurationSettings.AppSettings["ftpMode"]);
            // _fileBufferSize = 256kb
            byte[] buffer = new byte[_fileBufferSize];
            using (FileStream fs = new FileStream(uploadFile, FileMode.Open))
            {
                long dataLength = (long)fs.Length;
                long bytesRead = 0;
                int bytesDownloaded = 0;
                using (Stream requestStream = request.GetRequestStream())
                {
                    while (bytesRead < dataLength)
                    {
                        bytesDownloaded = fs.Read(buffer, 0, buffer.Length);
                        bytesRead = bytesRead + bytesDownloaded;
                        requestStream.Write(buffer, 0, bytesDownloaded);
                    }
                    requestStream.Close();
                }
            }
            return true;
        }
        catch (Exception ex)
        {
            // Catch exception
        }
        finally
        {
            request = null;
        }
        return false;
    }

欢迎所有建议。

1 个答案:

答案 0 :(得分:0)

整合您的文件以上传到多个要运行的任务,然后并行执行多个任务。

阅读有关并行任务的this older guide from Microsoft。现代版本可能如下所示。

public void UploadAllFiles(IEnumerable<FileUploadParameters> files) {
    var tasks = new List<Task>();

    foreach (var file in files) {
        var task = Task.Run(() => {
            UploadFile(file);
        });

        tasks.Add(task);
    }

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