於黾 2022-10-13 16:28 采纳率: 33.3%
浏览 22
已结题

数据采集遇到离奇内存泄漏,麻了,谁能提供点思路?

问题遇到的现象和发生背景

我有一个数据采集,自动采集Modbus tcp还有UDP的数据
用python做的,在cent os 7下运行
数据会分成两半,分别存在两个list里,两个线程分别连接两个服务端,将数据上传,上传之后就将list清空
用的是生产者消费者模型,采集好几个线程就往两个list里存,两个线程死循环从list里拿数据上传

用代码块功能插入代码,请勿粘贴截图
def UpdateTcpLocalThread(): #线程函数
    while True:
        try:
            UpdateTcpLocal(plcBoolListLocal,1)
            UpdateTcpLocal(plcFloatListLocal,0)
            UpdateTcpLocal(navListLocal,2) #三个全局list里面存的是数据
            time.sleep(refreshTime*2) #refreshTime是采样周期,上传周期是采样周期*2
        except:
            pass

def UpdateTcpLocal(dataList, typeNum):
    with threadLock: #线程锁
        NewList=dataList.copy() #先把数据转移出来,这样在上传过程中不影响生产者线程继续往里面堆数据
        dataList.clear()

    for data in NewList:
        ds.pushData(data[0],data[1],data[2],data[3],typeNum) #需要把list里的数据堆进byte数组
    
    ds.sendData(typeNum) #通过socket发送byte数组
    ds.clearData(typeNum) #不管发送成功失败都清空byte数组  
运行结果及报错内容

正式环境中连续跑了几个月都没有问题
后来又搭建了一个测试环境,一模一样的代码,只是本地库没有配,随手写了个255.255.255.1,保证它不会连通
结果几天就崩了,发现有内存泄漏,内存大概每2小时上涨2%,不会回落
今天把本地库的IP也指向唯一存在的服务端端口,内存泄漏的现象就没了,但是这样一来数据库里会有2份同样的数据

我的解答思路和尝试过的方法

仔细检查了一旦连接不上就不会清空list的可能性,没有啊,主要代码都在采集,一共也没几句上传的代码,感觉不应该出问题呀
也测试了如果socket连接不上,不停创建新的socket是否会不释放,没有呀,建个测试工程死循环不停建立socket,建立了几百万个,都自动回收了呀
上传的地方都加了try,线程应该不会崩,不管上传成功不成功list都清空

我想要达到的结果

什么情况?

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 10月21日
    • 修改了问题 10月13日
    • 修改了问题 10月13日
    • 创建了问题 10月13日

    悬赏问题

    • ¥15 lammps拉伸应力应变曲线分析
    • ¥15 C++ 头文件/宏冲突问题解决
    • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
    • ¥50 安卓adb backup备份子用户应用数据失败
    • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
    • ¥15 请问Lammps做复合材料拉伸模拟,应力应变曲线问题
    • ¥30 python代码,帮调试
    • ¥15 #MATLAB仿真#车辆换道路径规划
    • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
    • ¥15 数据可视化Python