6

HttpWebRequestを使用して大きなファイルをWebサービスにアップロードするアプリケーションを作成しています。

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

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

アップロードの速度は書き込みの間に計算され、その後GUIが更新されて上記の速度が表示されます。

私が直面している問題は、バッファサイズの決定です。大きくしすぎると、接続が遅いユーザーには速度の頻繁な更新が表示されなくなります。小さくしすぎると、接続が速いユーザーは読み取り/書き込みメソッドを「ハンマー」にしてしまい、CPU使用率が急上昇します。

私が今していることは、128kbでバッファを開始し、10回の書き込みごとに、それらの10回の書き込みの平均書き込み速度をチェックし、1秒未満の場合は、バッファサイズを128kb増やします。書き込み速度が5秒を下回った場合も、同様の方法でバッファを縮小します。

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

ありがとう

4

1 に答える 1

0

これは良いアプローチだと思います。私も大きなファイルのアップロードで使用しました。しかし、その中には小さなトゥイークがありました。別のサービスを呼び出して、最初の要求で接続速度を決定しました。これにより、リクエストごとに速度を再計算するオーバーヘッドが実際に節約されます。そうする主な理由は、

  1. 低速接続では、通常、速度が非常に変動します。したがって、リクエストごとに再計算しても意味がありません。

  2. また、ユーザーが前回終了した時点からファイルを再アップロードできる再開機能を提供することになっていました。

スケーラビリティを考慮して、最初のリクエストでバッファを固定していました。それが役に立ったかどうか教えてください

于 2012-06-03T05:34:24.787 に答える