8

ネットワーク接続が遅い海外のリモートサーバー上のファイルに大量のテキストを書き込もうとするプログラムがあります。

次のコードを使用します。ここoutputFileContentで、は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))

基盤となるSMBプロトコルは64kを超えるバッファー長をサポートしていないため、バッファーサイズを64kを超えて増やしても、どのような状況でも役に立ちません。直接ファイルコピーは引き続きSMBプロトコルを使用するため、ネットワークトラフィックの観点からは、バッファーサイズを除いて操作間にほとんど違いがないことに注意してください。

于 2013-01-29T17:41:45.657 に答える
-2

私はセキュリティの専門家ではありませんが、私の意見では、これは許可の問題に最も関連しています。

リモートサーバー上のディスクに何かを書き込むたびに、そのアクションを実行するユーザーに対して権限がチェックされます。当然、書く許可。

コピーの代わりに、そのコントロールは1つだけ実行されます。したがって、はるかに高速です。

実際、これを証明するために、ネットワークを介して複数のファイルをコピーし、ZIPファイル(zip状態で同じ量のメモリを使用)をネットワークを介してコピーすることを試みることができます。2番目のケースでは、単一のZIPファイルに対してパーミッション制御が1回だけ実行されるため、はるかに高速になります。

お役に立てれば。

于 2013-01-29T16:34:38.127 に答える