You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

关键优化点

  1. 滚动窗口截断:通过data1 = data1[-WINDOW_SIZE:]直接保留最新100个元素,操作高效且内存占用稳定。
  2. 按需生成DataFrame:仅用最新的窗口数据生成DataFrame,避免每次循环处理全量历史数据。
  3. 修正加速度计设置:原代码仅赋值了mpu_accelerometer_range但未生效,修改为直接设置mpu.accelerometer_range。
  4. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 21:05:22