【问题标题】:Partitioning a file for parallel download对文件进行分区以进行并行下载
【发布时间】:2012-02-20 06:47:53
【问题描述】:

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

【问题讨论】:

    标签: python floating-point numbers int division


    【解决方案1】:

    使用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
    

    【讨论】:

      【解决方案2】:

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

      >>> 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]
      

      【讨论】:

        【解决方案3】:

        最后一个线程的特殊情况——分配它以获取剩余的字节数。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-27
          • 2011-04-08
          • 2021-11-26
          • 1970-01-01
          • 2021-09-01
          相关资源
          最近更新 更多