2

n 個のサーバーからファイルを読み込んでおり、それぞれにファイルの 1/n をダウンロードさせたいと考えています。簡単な整数計算がうまくいくと思っていましたが、常にうまくいくとは限りません。

threads = n
thread_id = 0:n-1
filesize (in bytes) = x

starting position = thread_id*(filesize/threads)
bytes to read = (filesize/threads)

9 つのスレッドで分割された 26 バイトのファイルのように、適切な数の場合 (ばかげていることはわかっていますが、たとえば)、私の好みではうまくいきません。もっと良い方法があるはずです。何か案は?

4

3 に答える 3

1

唯一欠けているのは、最後のスレッド(スレッドn-1)がファイルの最後まで読み取って「モジュラス」バイトを取得する必要があることthreadsです。基本的:

bytes_to_read = (thread_id == n - 1) ? filesize / threads + filesize % threads
                                     : filesize / threads

filesize % threads別の方法として、スレッドごとに 1 バイトを bytes_to_read に追加することで、この余分な作業を最初のスレッドに分割することもできます。もちろん、開始位置を調整する必要があります。

于 2011-02-14T01:12:05.710 に答える
0

あなたは次のようなことをしなければなりません:

starting position = thread_id * floor(filesize / threads)
bytes to read = floor(filesize / threads) if thread_id != threads-1
bytes to read = filesize - (threads-1)*floor(filesize / threads) if thread_id = threads - 1
于 2011-02-14T01:11:59.877 に答える
0

各バイトを正確に 1 回読み取るには、開始位置と終了位置を一貫して計算し、減算してバイト数を取得します。

start_position = thread_id * file_size / n
end_position = (thread_id + 1) * file_size / n
bytes_to_read = end_position - start_position

end_position == file_size位置式は、 whenを与えるために慎重に選択されていることに注意してくださいthread_id == n-1。のような何か他のthread_id * (file_size/n)ことをする場合は、@wuputah が言うように、これを特別なケースとして扱う必要があります。

于 2011-02-14T03:14:35.257 に答える