Python用户名可用性检测程序迭代内存占用过高问题求助
内存占用过高问题原因及解决方案
你程序内存爆炸的核心原因是在死循环内重复全量加载用户名词典到队列,导致队列内容无限膨胀,其次还有多个不规范的写法加剧了内存泄漏。
具体问题点
- 死循环内重复加载词典:
checker函数的while True循环每次执行都会把整个wordlistInput对应的文件内容全量写入usernames队列,相当于每检测1个用户名,队列里就多一整份词典的内容,运行时间越久内存占用越高,完全符合你2小时涨到7G的症状。 - 滥用列表推导式执行副作用:
[self.usernames.put(line.strip()) for line in open(f"external/{wordlistInput}")]这句会生成一个和词典行数等长的列表,所有元素都是put方法返回的None,这个临时列表每次循环都会创建,没有被使用也没有及时回收,额外占用内存。 - 未显式管理文件与请求资源:循环内打开词典文件没有用上下文管理器也没有手动关闭,会残留文件对象;
requests.get得到的响应对象没有显式关闭,加上异常处理直接吞掉所有错误,会导致大量请求对象、响应内容残留无法被GC回收。 - 重复创建代理与登录对象:每次切换代理、重新登录时没有清理旧的代理实例、会话实例,残留的对象逐步堆积占用内存。
修复方案
- 把用户名词典加载逻辑移到死循环外,程序运行全程只加载一次即可,如果你需要循环遍历检测词典,可在所有用户名检测完成后再重新加载一次,不要每检测一个就全量加载。
- 把用于执行
put操作的列表推导式改成普通for循环,避免生成无用的临时列表。 - 所有文件操作使用
with上下文管理器自动关闭文件,每次请求完成后显式调用r.close()释放响应资源,也可以改用requests.Session复用连接减少对象创建。 - 更换代理、重新登录前手动清理旧的代理实例、会话实例,避免无用对象堆积。
修复后的核心代码示例
def checker(self): self.proxer = self.proxies() # 程序启动时只加载一次用户名到队列 with open(f"external/{wordlistInput}", "r", encoding="utf-8") as f: for line in f: self.usernames.put(line.strip()) while True: self.screen() name = self.usernames.get(); self.usernames.put(name) url = f"https://public-ubiservices.ubi.com/v3/profiles?nameOnPlatform={name}&platformType=uplay" if len(name) > 2: r = None try: r = requests.get(url, headers=self.headers, proxies=self.proxer, timeout=10) ctypes.windll.kernel32.SetConsoleTitleW(f"{datetime.now().strftime('%H:%M')} | Developed by gxzs#2979") if self.checkedCount % 75 == 0: self.checkedCount += 1 # 更换代理前清理旧代理 del self.proxer self.proxer = self.proxies() self.login() if r.status_code == 200: self.checkedCount += 1 res_data = r.json() if len(res_data['profiles']) == 0: self.create(name) # 手动清理响应数据 del res_data else: with open('external/errors.txt', "a", encoding="utf-8") as errorFile: errorFile.write(f"{datetime.now().strftime('%H:%M')} | Error message: {r.text}\n") self.errorCount += 1 del self.proxer self.proxer = self.proxies() self.login() except Exception: pass finally: # 无论请求是否成功都关闭响应对象 if r: r.close() del r
修改后再运行测试,内存会稳定在固定范围不会持续暴涨。
内容的提问来源于stack exchange,提问作者user16246484
相关产品推荐
相关产品推荐

