2012-01-27 11 views
2

私はマルチスレッドのダウンローダ(Pythonで)を作成したいと思います。開始する場所とダウンロードするバイト数をそれぞれのスレッドに伝える必要があります。そのために私はリモートファイルサイズを取得し、例えば2に分割します。次に、リモートファイルサイズが5であるとしましょう。私はその数値を2に分割すると結果として2を得ます。今私はダウンロードを開始することができますが、私はバイトを失うでしょう(2*2=4、5ではないので)。私はバイトの半分をダウンロードできないので、浮動小数点数を使うことはできません。私はその数字をどのように分けて、[2, 3]のリストを得ることができましたか?ファイルをパラレルに分割する

答えて

3

使用divmod

>>> divmod(5, 2) 
(2, 1) 
>>> 

これは、2で割っ5は余り1、2であるので、最後のピースが、ここでは2 + 1 = 3

>>> divmod(12345, 6) 
(2057, 3) 

になることを、あなたに伝えますあなたは2057に5つのチャンクを持ち、2057 + 3には最後のスライスを持っています。

ここ
>>> divmod(12345, 5) 
(2469, 0) 

、あなたが+ 0 2469で4つの2469でチャンクプラス最後のスライスを持っています:

このアルゴリズムはまた、除算が余りなしである場合、動作します。

だから、あなたのチャンクサイズのように計算することができる:あなたは、各チャンクのサイズを取得したい場合、あなたは、単に最後の要素を除算の余りを追加することができます

def chunk_sizes(filesize, num_chunks): 
    d, r = divmod(filesize, num_chunks) 
    result = [d] * num_chunks 
    result[-1] += r 
    return result 
0

特別な場合最後のスレッド - 多くのバイトが残っていますが、それを割り当てることができます。

1

>>> file_size = 11 
>>> no_of_chunks = 3 
>>> chunks = [file_size/no_of_chunks] * no_of_chunks 
>>> chunks[-1] += file_size % no_of_chunks 
>>> chunks 
[3, 3, 5] 

>>> for i in range(file_size % no_of_chunks): 
>>> chunks[i] += 1 
>>> chunks 
[4, 4, 3] 
:チャンクのサイズは高々1だけずれているので、あなたはまた、すべてのチャンク間で残りを配布することを変更することができます

関連する問題