2012-06-03 8 views
6

HttpWebRequestを使用して大きなファイルをWebサービスにアップロードするアプリケーションを作成しています。HttpWebRequestで大きなファイルを送信し、必要に応じてバッファを伸縮させます。

このアプリケーションは、様々なインターネット速度で様々な人々によって実行されます。

ファイルを非同期でチャンクで読み込み、それらのチャンクを要求ストリームに非同期で書き込みます。コールバックを使用してループでこれを行います。そして、私はファイル全体が送られるまでこれを続けます。

書き込みの間にアップロードの速度が計算され、その後、GUIが前記速度を示すように更新されます。

私が直面している問題は、バッファサイズを決めることです。大きすぎると接続が遅いユーザーには速度が頻繁に更新されることはありません。小さすぎると、高速接続のユーザーはCPUの使用を急増させる読み取り/書き込み方法を「叩く」ことになります。

私が今やっていることは、128kbでバッファをオフにしてから10回ごとに書き込みを行うことです。これらの10回の書き込みの平均書き込み速度をチェックし、2秒未満であればバッファサイズを128kb増加させます。書き込み速度が5秒以下になると、同様の方法でバッファを縮小します。

これは非常にうまくいきますが、すべては非常に恣意的であり、改善の余地があるようです。私の質問は、誰かが同様の状況に対処しており、どのような行動を取ったのですか?

ありがとうございました

+1

これは非常に確かなアプローチのようです。それも機能します。私はそれを変更しません。 – zmbq

答えて

0

これは良いアプローチだと思います。私も大規模なファイルのアップロードに使用されます。しかし、そこには小さなツイークがあった。私は、私の別のサービスに電話をかけて、最初のリクエストで接続速度を決めました。これは、実際にはすべての要求で速度を再計算するオーバーヘッドを節約します。その主な理由は、

  1. 遅い接続では、通常、速度が非常に変動します。したがって、すべての要求を再計算することは理にかなっていません。

  2. 私は、ユーザが前回終了した時点からファイルを再アップロードできる場所でもレジューム機能を提供するはずでした。

スケーラビリティを考慮して、私は最初の要求でバッ​​ファを修正することがありました。それが助けられたら教えてください

+0

私はそれが私が言及したようにそれを終え、それは非常にうまく動作します。ホストが別の国にいた場合や遅い日を過ごしていた場合は、読み方が間違っている可能性があるため、言及したようにスピードを解消する考えは一度もありませんでした。しかし、あなたはいくつかの良い点を挙げています。あなたの答えを受け入れました。 – NoPyGod

関連する問題