そのため、以前ファイル転送アプリケーションで作業していたときはストリーミングを使用していましたが、少なくともローカル マシンとの間で高速にファイルを転送できるようでした。
4GBを超える非常に大きなファイル(小さいものから大きいものまで、あらゆるファイルサイズを可能にしたい)で問題が発生し、ファイルを小さなチャンクに分割することを考える必要がありました。だから今、私は自分のプログラムの別の化身に取り組んでおり、大きなファイルを特定のチャンクサイズ(この場合は4MB)で指定されたチャンクに正常に分割しています。
それらのファイルをコールバック メソッドを介してクライアントに転送しますが、転送はストリーミングに比べてかなり時間がかかるようです。
メッセージ転送のパフォーマンスを実際に向上させることができる WCF 内の特定の設定、またはパフォーマンスを妨げている可能性のある設定はありますか?
public void RequestFile()
{
IFileTransferCallback callback = OperationContext.Current.GetCallbackChannel<IFileTransferCallback>();
while (chunkedFile.MoreChunks)
{
callback.ReceiveFile(chunkedFile.NextChunk(), chunkedFile.MoreChunks);
}
host.Close();
}
これらは、私が現在使用しているバインディング設定です。一部は任意に設定されています。
NetTcpBinding binding = new NetTcpBinding(SecurityMode.None, true);
binding.MaxBufferPoolSize = int.MaxValue;
binding.ReaderQuotas.MaxDepth = int.MaxValue;
binding.ReaderQuotas.MaxStringContentLength = int.MaxValue;
binding.ReaderQuotas.MaxArrayLength = int.MaxValue;
binding.ReaderQuotas.MaxBytesPerRead = int.MaxValue;
binding.ReaderQuotas.MaxNameTableCharCount = int.MaxValue;
binding.MaxBufferSize = int.MaxValue;
binding.MaxConnections = 500;
binding.MaxReceivedMessageSize = int.MaxValue;
binding.TransferMode = TransferMode.Buffered;
binding.SendTimeout = new TimeSpan(0, 5, 0);
binding.ReceiveTimeout = new TimeSpan(0, 5, 0);
BindingElementCollection collection = binding.CreateBindingElements();
collection.Add(new MtomMessageEncodingBindingElement());
UnityContainer.RegisterInstance(typeof(Binding), binding);
編集:
速度を上げるためにあらゆる種類のオプションをいじっています。サーバー localhost を実行すると、明らかに 700 MB のファイルを数秒で処理できます... しかし、外部 IP で実行すると、かなりの時間がかかり、15 mbps のアップロード速度が許容するよりもはるかに長くなります。
どうしたの?WCF の速度にハード キャップはありますか? ロックを解除するにはどうすればよいですか?きっと今よりもっと速く走れるはずです。まだ計算方法がわからないので、データ転送の速さを正直に言うことはできませんが、おそらく 250kbps 前後だと思います。
2番目の編集:
ストリーミング システムを再度セットアップしましたが、チャンクを利用しています。そのため、全体的に大きなファイルのチャンクをストリーミングしています。
インターネット上で 64 MB のチャンクを使用して、862 MB のファイルを 11 分 30 秒でストリーミングしました。ダウンロード速度は最大 25 mbps、アップロード速度は約 5 mbps です。それはかなり良いと思います。
バッファリングされたストリーミング モードでこれらの速度を達成できないのは残念です。
どうしてこれなの?なぜそのような制限があるのですか?なぜストリーミングはこれほど高速なのですか?
さらに詳しい情報
チャンク サイズを 64 から 8 に、次に 4 に、最後に 2 に減らすと、結果はますます高速になり、2 MB のチャンク サイズで 2 分で 862 MBのファイル転送が行われました。バッファー転送モードでは、このようなことは決して達成できませんでした。