gpt4 book ai didi

Python-请求在使用 session 下载时不清除内存

转载 作者:太空狗 更新时间:2023-10-30 02:21:45 25 4
gpt4 key购买 nike

我有一个应用程序,我在其中使用请求从服务器下载 .mp3 文件。

代码如下所示:

self.client = requests.session(headers={'User-Agent': self.useragent})

def download(self, url, name):
request = self.client.get(url)

with open(name, "wb") as code:
code.write(request.content)

print "done"

问题是当下载完成后,python 不会清除内存,所以每次我下载 mp3 时,应用程序的内存使用量都会随着 mp3 的大小而增加。内存不会再次被清除,导致我的应用使用大量内存。

我认为这与我保存文件的方式或 requests.session 的工作方式有关。

任何建议。

编辑:这是代码: https://github.com/Simon1988/VK-Downloader

相关部分在lib/vklib.py

最佳答案

除了您不了解内存分配的工作原理之外,我认为这里没有实际问题。

当 Python 需要更多内存时,它会向操作系统请求更多内存。处理完该内存后,它通常不会将其返回给操作系统;相反,它会为以后的对象保留它。

因此,当您打开第一个 10MB 的 mp3 时,您的内存使用量从 3MB 变为 13MB。然后释放该内存,但仍为 13MB。然后你打开第二个 10MB mp3,但它重复使用相同的内存,所以你仍然是 13MB。等等。

在您的代码中,您要为每次下载创建一个线程。如果您同时有 5 个线程,都使用 10MB,显然这意味着您使用了 50MB。并且那 50MB 不会被释放。但是,如果您等待它们完成,然后再进行 5 次下载,它将再次重复使用相同的 50MB。

由于您的代码不以任何方式限制线程数,因此没有什么(除了 CPU 速度和上下文切换成本)可以阻止您启动数百个线程,每个线程使用 10MB,即千兆字节的 RAM。但只要切换到线程池,或者如果下载太多,则不让用户启动更多下载等,都可以解决这个问题。

所以,通常这不是问题。但如果是,有两种解决方法:

  1. 创建子进程(例如,通过 multiprocessing 模块)来执行内存占用工作。在任何现代操作系统上,当一个进程消失时,它的内存就会被回收。这里的问题是,一遍又一遍地分配和释放 10MB 实际上会减慢您的系统速度,而不是加快它的速度 — 进程启动的成本(尤其是在 Windows 上)会使情况变得更糟。因此,您可能希望将更多的作业分拆到 c 子进程。

  2. 不要一次将整个内容读入内存;使用流式 API 而不是整个文件 API。对于requests,这意味着在初始请求中设置stream=True,然后通常使用r.raw.read(8192)r.iter_content() 或循环中的 r.iter_lines() 而不是访问 r.content

关于Python-请求在使用 session 下载时不清除内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14270053/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com