首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对文件进行分区以进行并行下载

对文件进行分区以进行并行下载
EN

Stack Overflow用户
提问于 2012-01-27 16:23:31
回答 3查看 110关注 0票数 2

我想做一个多线程下载器(在Python中),我需要告诉每个线程从哪里开始,下载多少字节。为此,我得到远程文件大小,并将其除以2。现在,假设远程文件大小为5:当我将该数字除以2时,结果为2。现在我可以开始下载了,但是我会丢失一个字节(因为2*2=4,而不是5)。我不能使用浮点数,因为我不能下载半个字节。例如,我如何用[2, 3]除以这个数字并得到一个列表?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-27 16:28:47

使用divmod

代码语言:javascript
运行
复制
>>> divmod(5, 2)
(2, 1)
>>>

这告诉你,5除以2是2,余数是1,所以最后一块是2+1= 3。

代码语言:javascript
运行
复制
>>> divmod(12345, 6)
(2057, 3)

在这里,你将在2057年有5个块,在2057+3有最后一块。

此算法也适用于除法没有余数的情况:

代码语言:javascript
运行
复制
>>> divmod(12345, 5)
(2469, 0)

在这里,你将有4个块在2469,加上最后一个切片在2469+0。

因此,您的块大小可以计算为:

代码语言:javascript
运行
复制
def chunk_sizes(filesize, num_chunks):
    d, r = divmod(filesize, num_chunks)
    result = [d] * num_chunks
    result[-1] += r
    return result
票数 3
EN

Stack Overflow用户

发布于 2012-01-27 16:29:17

如果想要得到每个块的大小,可以简单地将除法的剩余部分添加到最后一个元素:

代码语言:javascript
运行
复制
>>> 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:

代码语言:javascript
运行
复制
>>> for i in range(file_size % no_of_chunks):
>>>    chunks[i] += 1
>>> chunks
[4, 4, 3]
票数 1
EN

Stack Overflow用户

发布于 2012-01-27 16:25:35

特殊情况下,最后一个线程--分配它来获取剩余的字节数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9030601

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档