Pico W调用Firebase接口触发OSError: [Errno 12] ENOMEM内存问题求助
解决Pico W执行
urequests.get().json()时的内存不足问题 1. 避免一次性加载整个JSON响应
urequests的.json()方法会把完整响应内容读入内存后再解析,这对Pico W的小内存来说压力极大。改成逐块读取响应,只提取你需要的数字字段:
import urequests import gc gc.collect() # 先手动回收闲置内存 response = urequests.get(url + "/embeded_system.json") target_num = None # 逐行遍历响应,定位目标字段 for line in response.iter_lines(): # 替换成你Firebase中存储数字的键名,比如b'"display_num"' if b'"your_target_key"' in line: # 从行中提取数字字符串,适配类似 "key": "1234" 的格式 parts = line.split(b':') if len(parts) >= 2: target_num = parts[1].strip().strip(b'"').decode() break response.close() gc.collect() # 后续用target_num更新LCD即可
2. 简化Firebase返回的数据结构
如果你的JSON包含大量无关字段,直接在Firebase端精简数据:
- 单独创建一个仅存储目标数字的节点,比如返回
{"num": "123"}而非包含其他冗余内容的大JSON - 更极端的话,直接返回纯数字字符串(不用JSON格式),读取时无需解析JSON:
response = urequests.get(url + "/display_num.txt") # Firebase返回纯数字文本 target_num = response.text.strip() response.close()
3. 强化内存回收与变量管理
在请求前后强制回收内存,同时及时清理无用变量:
# 先删除当前未使用的变量 del unused_var1, unused_var2 gc.collect() response = urequests.get(...) # 处理响应逻辑 target_num = ... response.close() # 立即删除response变量,再回收内存 del response gc.collect()
4. 使用更轻量化的HTTP请求实现
跳过urequests的封装,直接用socket实现核心HTTP请求逻辑,减少冗余内存占用:
import socket import gc gc.collect() # 解析URL的主机地址 host = url.split('//')[1] s = socket.socket() addr = socket.getaddrinfo(host, 80)[0][-1] s.connect(addr) # 发送最简HTTP请求 s.send(b'GET /embeded_system.json HTTP/1.1\r\nHost: ' + host.encode() + b'\r\nConnection: close\r\n\r\n') # 跳过响应头,直到空行 while True: line = s.readline() if line == b'\r\n': break # 分块读取响应体,提取目标数字 target_num = None while True: chunk = s.read(64) # 每次读64字节,降低内存负载 if not chunk: break if b'"your_target_key"' in chunk: parts = chunk.split(b':') if len(parts) >= 2: target_num = parts[1].strip().strip(b'"').decode() break s.close() gc.collect()
内容的提问来源于stack exchange,提问作者user23003600
相关产品推荐
相关产品推荐

