如何以多个同时的块下载大文件并将其保存到Python中的同一文件中?

问题描述 投票:0回答:2

我正在使用PyCurl,范围http标头和Python线程,因此,如果我需要下载1 gb文件并想要使用例如与服务器的5条连接来加快处理速度,我只将1 gb分为五个部分,并且创建五个线程,每个线程下载1/5,然后将1/5保存到“ .part”文件中,当5个线程全部完成并下载其1/5文件时,我只需加入所有部分并重新创建1 gb文件。我的问题是...。我该如何以相同的5个块下载文件,而不是将每个块保存到临时文件中,然后将所有文件加入原始文件中,只需下载5个部分并将这些部分保存到直接一个1gb文件?这可能吗?

python multithreading file download chunks
2个回答
1
投票

因此,正如我们在评论中所讨论的,您不能really做您想做的事情。不过,我有几个想法可能会对您有所帮助。

选项1

如果知道要下载的文件大小,则可以创建所需大小的文件,并用下载的字节覆盖。

with open("some_file_name", "wb") as f:
    f.truncate(some_size)

with open("some_file_name", "wb") as f:
    f.seek(some_size - 1)
    f.write('\0')

请注意,如果指定的大小超过文件的当前大小,则结果取决于平台:可能的情况包括文件可能保持不变,增大为指定大小(好像是零填充的)或增大为指定的大小,未定义的新内容。

因此,当您下载部分时,您可以使用]覆盖特定的字节块>

with open("some_file_name", "r+b") as f:
    f.seek(offset)
    f.write(data_chunk)

选项2

决定了您愿意使用多少内存,一次只能下载一定数量的部件。

示例:如果您确定只想使用1GB,并且要以250 MB的块大小下载一个大文件,则该文件

  • 开始并行下载前四个块。
  • 当块1完成下载后,您可以将其写入磁盘并开始下载块5。
  • [如果一个块在较低的块之前完成下载(例如2在1之前完成),将其保存在内存中,直到另一个块完成
  • 这将内存使用量限制为1 GB,因为一次下载的块不超过四个250 MB
  • 选项3

写入临时文件(如您在原始问题中提到的那样,但将其保存在用户可能看不到它们的位置,例如系统的temp目录或程序创建的隐藏目录中)


1
投票

至少在UNIX / Linux系统上,您应该能够轻松地做到这一点。关键是您应该在线程1中创建一次文件,然后将其打开以进行写入。然后,您需要再次re-open

© www.soinside.com 2019 - 2024. All rights reserved.