Python列表内存优化:树莓派实时数据预测的旧元素清理方案
内存优化方案:用滚动窗口控制数据量
完全可以通过删除旧数据来控制内存占用,这种滚动窗口的方式是实时数据处理中常用的内存优化手段,能确保列表始终只保留预测所需的最新数据,避免内存持续增长耗尽资源。
原代码问题分析
你的当前代码每次循环都会将整个data1列表转换为DataFrame,且data1无限制追加数据,长期运行必然导致内存占用越来越高。
修改后的代码实现
下面是优化后的代码,实现“保留最新100个数据,自动删除更早元素”的逻辑:
import numpy as np import pandas as pd import board import adafruit_mpu6050 import time i2c = board.I2C() mpu = adafruit_mpu6050.MPU6050(i2c) # 修正原代码:将加速度计范围设置生效 mpu.accelerometer_range = adafruit_mpu6050.Range.RANGE_4_G data1 = [] # 定义要保留的最新数据量(即窗口大小) WINDOW_SIZE = 100 while True: ax, ay, az = mpu.acceleration magnitude = np.sqrt(np.square(ax) + np.square(ay) + np.square(az)) data1.append([magnitude]) # 当数据量足够时执行预测 if len(data1) >= WINDOW_SIZE: # 仅用最新的100个数据生成DataFrame,避免处理全量数据 df = pd.DataFrame(data1[-WINDOW_SIZE:]) # -------------------------- # 在这里插入你的实时预测代码 # 例如:prediction = your_model.predict(df) # -------------------------- # 预测完成后,截断列表,只保留最新的100个元素 # 直接取最后WINDOW_SIZE个元素,比逐个删除更高效 data1 = data1[-WINDOW_SIZE:] # 添加小延迟,降低树莓派CPU占用率 time.sleep(0.01)
关键优化点
- 滚动窗口截断:通过
data1 = data1[-WINDOW_SIZE:]直接保留最新100个元素,操作高效且内存占用稳定。 - 按需生成DataFrame:仅用最新的窗口数据生成DataFrame,避免每次循环处理全量历史数据。
- 修正加速度计设置:原代码仅赋值了
mpu_accelerometer_range但未生效,修改为直接设置mpu.accelerometer_range。 - CPU占用优化:添加
time.sleep(0.01)避免循环过于频繁占用过多CPU资源。
更进一步的内存优化
如果不需要保留完整的列表结构,还可以用固定大小的numpy数组循环覆盖数据,内存占用完全固定,更适合长期运行:
import numpy as np import board import adafruit_mpu6050 import time i2c = board.I2C() mpu = adafruit_mpu6050.MPU6050(i2c) mpu.accelerometer_range = adafruit_mpu6050.Range.RANGE_4_G WINDOW_SIZE = 100 # 创建固定大小的numpy数组,初始化为0 data_array = np.zeros((WINDOW_SIZE, 1)) current_idx = 0 while True: ax, ay, az = mpu.acceleration magnitude = np.sqrt(np.square(ax) + np.square(ay) + np.square(az)) # 循环覆盖数组中的旧数据 data_array[current_idx] = magnitude current_idx = (current_idx + 1) % WINDOW_SIZE # 当数组被完整填充一次后,开始执行预测 if current_idx == 0: # -------------------------- # 在这里使用data_array执行预测 # 例如:prediction = your_model.predict(data_array) # -------------------------- pass time.sleep(0.01)
这种方式无需维护列表的增删操作,内存占用始终为WINDOW_SIZE * 单个数据大小,是资源受限设备(如树莓派)的最优选择。
内容的提问来源于stack exchange,提问作者DholuBholu
相关产品推荐
相关产品推荐

