我想製作一個多線程下載器(使用Python),我需要告訴每個線程從何處開始以及要下載多少字節。爲此,我得到遠程文件的大小,並將其分成例如2.現在,假設遠程文件大小爲5:當我將數字除以2時,結果爲2。現在我可以開始下載了,但是我會丟失一個字節(因爲2*2=4
,而不是5)。我無法使用浮點數,因爲我無法下載一半字節。例如,我可以將這個數字除以[2, 3]
以獲得一個列表嗎?爲並行下載分區文件
2
A
回答
3
使用divmod
:
>>> divmod(5, 2)
(2, 1)
>>>
這就告訴你,這5 2爲2,餘1分,所以最後一塊將是2 + 1 = 3
>>> divmod(12345, 6)
(2057, 3)
這裏,你將在2057年有5塊,最後一塊在2057 + 3。
此算法也將爲情況下工作,在分工是沒有餘數:
>>> divmod(12345, 5)
(2469, 0)
在這裏,你將不得不在2469 4塊加上2469 + 0最後切片。
所以,你的塊大小可以被計算爲:
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]
你也可以修改在所有塊分配剩餘部分,從而使塊的大小由偏離至多1:
>>> for i in range(file_size % no_of_chunks):
>>> chunks[i] += 1
>>> chunks
[4, 4, 3]
相關問題
- 1. 寫下載文件的部分區域
- 2. 下載文件並完成百分比
- 3. 使用PowerShell下載並運行文件
- 4. PHP中的並行下載文件
- 5. 並行下載多個文件? (Linux/Python?)
- 6. index.php不能作爲下載文件打開並運行
- 7. 並行下載
- 8. Phpseclib:部分文件下載
- 9. 下載文件,並設置下載的文件名
- 10. 從BitBucket下載併合並文件
- 11. 如何下載並將.data文件轉換爲.csv文件?
- 12. 閱讀PDF文件並以iText作爲下載文件提供
- 13. DownloadManager:將文件下載到緩存分區
- 14. 如何將文件拆分成零件並下載
- 15. android-在下載文件之前爲文件預分配空間
- 16. 下載大量文件的區塊
- 17. 下載文件「另存爲」
- 18. .zip文件下載爲.php
- 19. xcode下載爲.dmg文件
- 20. 直接下載文件vs讀取文件作爲下載
- 21. HTML 5 - 下載並運行/執行文件
- 22. 爲什麼javascript阻止並行下載?
- 23. 分區的並行生成
- 24. 下載一個網頁並保存爲UTF-8文本文件
- 25. 下載的文本文件,並保存爲一個的NodeJS串
- 26. 如何爲並行加載劃分表
- 27. 如何與PHP的捲曲庫並行下載文件的多個部分?
- 28. 在C#中部分下載並序列化大文件?
- 29. 在javascript中下載和合並多部分文件
- 30. 下載並保存文件並保留相同的文件名