携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第28天,点击查看活动详情
你也可以手敲一个高速下载器(十三)保存下载块(上)
前言
我们在最开始有提过下载块保存方案、其中包括保存在本地和内存中,我们目前的做法的保存是保存在内存中,但是对于那种特别大的文件会耗满我们的内存,所以我们这次根据情况把下载的块保存在本地。
方案
有些文件特别大,特别文件特别小,而文件不大的还要把下载的块保存在本地就没有必要了,所以我们要根据情况来决定是否要把下载的块保存在本地。因为每个人的运行环境不同,硬件设备不同这个大小的定义也就不同。所以我们的方案是判断系统的剩余内存大小,然后以剩余内存的一半为临界点。
获取剩余内存
这里是使用到了一个第三方的库:psutil ,是一个系统和进程实用程序的库,可以获取到系统cpu、内存、磁盘、网络和正在运行的程序等情况
使用到的方法是:psutil.virtual_memory()
,是以命名元组的形式返回有关系统内存使用情况的统计信息,以字节表示,官方文档为:psutil.readthedocs.io/en/latest/i…
根据以上文档内容可以看出我们如果要获取剩余内存可以选择使用available
,下面我们来写一个简单的demo试一下:
import psutil
def format_size(filesize: float):
"""
格式化输出文件大小
:param filesize: 文件大小
:return: 返回格式化的字符串
"""
for count in ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB']:
if -1024.0 < filesize < 1024.0:
return f"{filesize:3.1f} {count}"
filesize /= 1024.0
return f"{filesize:3.1f} YB"
if __name__ == '__main__':
memory = psutil.virtual_memory()
free = memory.available
print(f"剩余可用内存:{format_size(free)}")
我们再来和系统的任务管理器对比一下:
结果是差不多的,我们用这个结果来除2就是我们是否选择保存内存块的临界大小
文件保存方案
关于文件的保存第一时间想到的是在每一块下载完的时候直接保存至文件,然后在所有块都下载完的时候在依次遍历所有文件块,然后在按顺序保存至新的文件中,后删除源文件。但这种方案有一个弊端就是流程繁琐,且耗费时间长。所以我们可以换个思路:既然单一块下载结束后要写入文件,那么如果每一块直接写入到对应的位置不就好了
这里可以使用f.seek(offset, whence)
的这个方法,这个方法可以选择读取或写入文件的文件,我们看一下文档里面是怎么说的:
f.seek(offset, whence)
可以改变文件对象的位置。通过向参考点添加 offset 计算位置;参考点由 whence 参数指定。 whence 值为 0 时,表示从文件开头计算,1 表示使用当前文件位置,2 表示使用文件末尾作为参考点。省略 whence 时,其默认值为 0,即使用文件开头作为参考点。
下节继续吧
这节先说一下理论和方案,下节在说具体怎么实现。敬请期待!!!