8

我有一个程序试图将大量文​​本写入海外远程服务器上的文件,该服务器的网络连接速度很慢。

使用以下代码,其中outputFileContenta StringBuilder

using (var outfile = new StreamWriter(myRemoteFilePath))
{
    outfile.Write(outputFileContent.ToString());
}

运行需要很长时间(几分钟),而如果我先写入本地文件,然后将其复制到远程位置,则速度要快得多(20-30 秒):

string tempFilePath = Path.GetTempFileName();
using (var outfile = new StreamWriter(tempFilePath))
{
    outfile.Write(outputFileContent.ToString());
}

System.IO.File.Copy(tempFilePath, myRemoteFilePath, true)

知道为什么会这样吗?我唯一的猜测是这与通过网络进行缓冲有关,或者可能是因为流编写器不知道它需要提前多大。

4

2 回答 2

16

如果您使用默认缓冲区大小创建 StreamWriter,则底层 SMB 协议将以不大于 4096 字节的块发出写入请求,这意味着通过网络进行大量往返。您可以将 StreamWriter 的缓冲区大小增加到最大 64k 以减少往返次数:

using (var outfile = new StreamWriter(myRemoteFilePath, false, Encoding.ASCII, 0x10000))

在任何情况下,将缓冲区大小增加到超过 64k 都无济于事,因为底层 SMB 协议不支持超过 64k 的缓冲区长度。请注意,直接文件复制仍然使用 SMB 协议,因此从网络流量的角度来看,除了缓冲区大小之外,操作之间几乎没有区别。

于 2013-01-29T17:41:45.657 回答
-2

我不是安全专家,但在我看来,这与权限问题最相关。

每次您将某些内容写入远程服务器上的磁盘时,都会针对执行该操作的用户检查权限。写的许可,自然而然。

在这种情况下,而不是副本,该控制只被执行。所以它快得多。

事实上,为了证明这一点,您可以尝试通过网络复制多个文件,然后通过网络复制 ZIP 文件(在压缩状态下具有相同数量的内存)。在第二种情况下,它会快得多,因为权限控制只执行一次,对于单个 ZIP 文件。

希望这可以帮助。

于 2013-01-29T16:34:38.127 回答