1

ファイルごとにサーバー ファイルにアップロードし、ファイル アップロードの進行状況を示す進行状況バーを表示するシステムがあります。次に、2 番目の進行状況バーの下に、アップロード待ちのすべてのファイルで完了したバッチのパーセンテージを示します。

私が解決できる情報とアルゴリズムは次のとおりです。

送信バイト数 / 送信する合計バイト数 = 最初の進行状況バー (例: 1024KB のうち 512KB (50%))

それはうまくいきます。ただし、アップロードするファイルが他に 2 つ残っているとしますが、両方のファイル サイズは不明です (これは、ファイルがアップロードを開始しようとしているときにのみわかり、その時点で圧縮され、ファイル サイズが決定されるため)、どのように作成しますか?私の3番目の進行状況バー?

最初のプログレス バーのロジックを大規模に複製するには、「Total Bytes Sent」/「Total Bytes To Send」が必要になるため、これが可能になるとは思いませんでしたが、動作するバージョンを取得しました。現在のファイル番号" / "送信するファイルの総数" はバッチ全体のパーセンテージを返しますが、明らかに増分更新は行われず、かなり粗雑です。

したがって、さらに考えてみると、現在のファイル % をこのアルゴリズムに組み込むことができれば、おそらくバッチの現在のポイントの正しい進捗率を取得できると思いました。

私はこのアルゴリズムを試しましたが、残念ながらそのような役に立ちませんでした (数学の頭には申し訳ありませんが、なぜ機能しないのかはおそらく明らかです)。

("Current file number we are on" / "total number of files to send") * ("Bytes Sent" / "Total Bytes To Send")

たとえば、この例でテストしたとき、私は正しい軌道に乗っていると思いました: 2/3 (3 番目のファイルの 2 番目) = 66% (これは今のところ正しいです)。ファイルがアップロードされました)、13% に戻りました。必要なのは 33% 強だけです。私は 0.80 と a (2/3 * (2/3 * 0.2)) で逆を試しました

これは、アップロードするバッチ内のバイト全体を知らなくても実行できますか?

助けてください!ありがとうございました!

4

3 に答える 3

1

@Carl が観察したように、まだ送信する量がわからない場合は、既に送信された割合の正確な見積もりを作成できません。科学的な正確さと完全性はさておき、あなたの計算は次のとおりです。

("Current file number we are on" / "total number of files to send") * 
("Bytes Sent" / "Total Bytes To Send")

ファイルの分数の考え方を組み込むように拡張する必要があります。たとえば、11 個のファイルのうち 6 個のファイルを送信し、7 番目のファイルの 30% を送信した場合、次のように計算します。

(6.3 / 11) * ("Bytes Sent" / "Total Bytes To Send")

途中のどこかで、現在のファイル0.66*0.2=0.13の割合を加算するのではなく、送信したファイルの数に現在送信済みのファイルの割合を掛けました。つまり、 を計算しました。

科学的な正確さと完全性を再び取り上げて、2 番目のプログレス バーの送信率を使用してみませんか? 適切な期間にわたってそれを統合すると、ウォッチャーに何かが起こって進歩しているという満足感を与えるはずです.

于 2010-03-17T10:17:47.673 に答える
1

キューに入れられた他のファイルの大きさがわからない場合、必要な時間に関連し、比例するパーセンテージ値を正確に表示する方法はありません。

いくつかの回避策が思い浮かびます。

  • ご存知のように見えて実際にはユーザーを欺いている 1 つのアプローチは、キューに入れられたすべてのファイルが進行中のファイルと同じサイズ、またはこれまでに処理されたファイルの平均であると想定することです。これに基づいて、すべてのファイルが実際に同じサイズである場合、進行状況バーは「真実」を示し、サイズが大幅に異なる場合は非常にずれます。

  • 別のアプローチは、2 番目の進行状況バーに、転送されたバイトの割合ではなく、ファイルの割合を表示することです。したがって、4 つのファイルがある場合、そのバーは 0 から 25%、50%、75%、100% とホップします。かかった時間を正確に反映しているわけではありませんが、少なくとも嘘をついているわけではありません。

  • Microsoft のようなアプローチでは、さらに悪化する可能性があります。プログレス バーの成長が 100% に近づくにつれて漸近的に遅くなり、実際に最後に到達することはありません。ユーザーに表示されるのは、常に「ほぼ完了」に近い値だけです。このような表示はクールに見えますが、実際にはユーザーに提供する情報は最小限に抑えられています。

于 2010-03-17T09:57:54.630 に答える
0

おやおや、私は最も単純なアプローチを考えていませんでした:

(double)((ProcessedFileCount + DecimalBytesTransferred) / TotalFileCount)

(ここで、processedFileCountは常に完全に転送された完全なファイルを示します)

3ファイルバッチのテストケースを証明します。

Eg. ((2 + 1.0) / 3) (File 1+2+3: 100%) == batch 100% complete.
Eg. ((2 + 0.9) / 3) (File 1+2: 100%, File 3: 90%) == batch 96% complete.
Eg. ((1 + 0.9) / 3) (File 1: 100%, File 2: 90%) == only 63% complete.

御馳走になります!皆さんのご意見ありがとうございます。外部からのアドバイスはすべて検討します。

于 2010-03-17T11:05:08.753 に答える