首页 > 系统相关 >Influxdb内存泄漏

Influxdb内存泄漏

时间:2024-06-04 15:25:00浏览次数:15  
标签:泄漏 workshopCode string Influxdb Tag ToString 内存 groupcode now

  • 项目类型:Windows Service
  • .net Version:  .net Framework 4.8
  • 开发语言: C#
  • influxDB API:  InfluxDB.Client v4.15.0 InfluxDB.Client.Core v4.15.0

重现代码:

创建一个Timer周期性地调用写入函数:

_timerWriteDB = new Timer((o) => WriteData(), null, timeMinute * 1000, 60 * 1000); // per 1 minutes

WriteData的实现:

private async void WriteData()
        {
            try
            {
                lock (syncTable)
                {
                    string now = DateTime.Now.ToString("HH:mm:ss");
                    foreach (DataRow r in deviceWorkHour.Rows)
                    {
                        if (string.Compare(now, r["startTime"].ToString()) >= 0
                            && string.Compare(now, r["endtime"].ToString()) < 0)
                        {
                            var point = PointData.Measurement(Measurement)
                            .Tag("plantcode", r["plantcode"].ToString())
                            .Tag("workshopCode", r["workshopCode"].ToString())
                            .Tag("linecode", r["linecode"].ToString())
                            .Tag("groupcode", r["groupcode"].ToString())
                            .Tag("WorkTimeType", r["WorkTimeType"].ToString())
                            .Field("schdTime", 60); //每分钟写一次,即每次60s

                            var writeApi = _influxDBClient.GetWriteApi();
                            writeApi.WritePoint(point, bucket, org);
                            _logger.Info($"log schdTime for {r["groupcode"]}");
                        }
                    }
                }

            }
            catch (Exception ex)
            {
                _logger.Error(ex.ToString());
            }
        }

修改办法,将异步方法 GetWriteApi 修改为同步方法 GetWriteApiAsync

        private void WriteData()
        {
            try
            {
                lock (syncTable)
                {
                    string now = DateTime.Now.ToString("HH:mm:ss");
                    List<PointData> points = new List<PointData>();
                    foreach (DataRow r in deviceWorkHour.Rows)
                    {
                        if (string.Compare(now, r["startTime"].ToString()) >= 0
                            && string.Compare(now, r["endtime"].ToString()) < 0)
                        {
                            var point = PointData.Measurement(Measurement)
                            .Tag("plantcode", r["plantcode"].ToString())
                            .Tag("workshopCode", r["workshopCode"].ToString())
                            .Tag("linecode", r["linecode"].ToString())
                            .Tag("groupcode", r["groupcode"].ToString())
                            .Tag("WorkTimeType", r["WorkTimeType"].ToString())
                            .Field("schdTime", 60); //每分钟写一次,即每次60s
                            points.Add(point);
                        }
                    }
                    var writeApi = _influxDBClient.GetWriteApiAsync();
                    writeApi.WritePointsAsync(points, bucket, org);
                }

            }
            catch (Exception ex)
            {
                _logger.Error(ex.ToString());
            }
        }

 

总结,这应该是一个bug。

 

标签:泄漏,workshopCode,string,Influxdb,Tag,ToString,内存,groupcode,now
From: https://www.cnblogs.com/crazyghostvon/p/18230816

相关文章

  • 解锁 Java I/O 力量,一站式掌握文件操作、内存映射等黑科技
    大家好,今天我们来聊一聊Java中的I/O操作这个重要话题。作为一名资深Java开发者,深入掌握JavaI/O体系不仅可以让我们对文件、网络等资源操作游刃有余,更可以在一些场景下发挥其独特的性能优势。接下来,就让我为您一一拨开JavaI/O的神秘面纱!一、JavaI/O家族简......
  • 数据在内存中的存储<C语言>
    导言       在计算机中不同类型的数据在计算机内部存储形式各不相同,弄懂各种数据在计算机内部存储形式是有必要的,C语言的学习不能浮于表面,更要锻炼我们的“内功”,将来在写程序的时候遇见各种稀奇古怪的bug时,也便能迎刃而解,所以本文将着重介绍,整数在内存中的存储、大小......
  • 如何利用CXL技术突破内存墙?-1
    CXL诞生的基础是为了解决CPU内存和附加设备内存的互联,实现资源共享,得到最大的性能提升。随着数据大规模超算、AI、5G、云技术、边缘计算、自动驾驶等蓬勃发展,未来的数据存在指数级的增长且要求实时计算。从2019年的CXL1.0,CXL协议目前已经发展了CXL3.1。服务器目前正面临着......
  • 如何利用CXL技术突破内存墙?-2
    为了解决这些问题,业界正积极寻求新的技术和标准,比如ComputeExpressLink(CXL),它旨在通过提供标准化的高速互连来提高内存带宽、降低延迟,并简化内存扩展的软件集成,从而有效地打破内存墙的限制。通过使用CXL(ComputeExpressLink)技术来突破内存墙,可以实现以下几项关键改进,比如......
  • c语言中,结构体变量交换改写为堆空间申请内存
            在这里我实现的功能为:输入三个人的信息,每个人的信息分别为姓名和三个成绩,我分别计算三个人的成绩和,并通过经典的三杯水案例完成对三个人的成绩从小到大的排列打印。重点:     我这里使用的为堆空间申请内存的形式 第一步:        定义一个......
  • 【C语言进阶】--- 动态内存管理
    动态内存管理函数1.malloc函数void*malloc(size_tsize);功能:向堆区的空间中申请一块大小为size个字节的空间,返回指向这块空间的指针如果开辟失败会返回一个NULL指针,因此要检查malloc的返回值,避免返回NULL指针后再访问空指针malloc申请的空间,程序退出后会还给操作系统......
  • 《Linux内核完全注释》学习笔记:2.5 Linux内核对内存的使用方法
    在Linux0.11内核中,为了有效地使用机器中的物理内存,内存被划分成几个功能区域,如图2-9所示。图2-9物理内存使用的功能区域分布图Linux内核程序占据在物理内存的开始部分,接下来是用于供硬盘或软盘等块设备使用的高速缓冲区部分。当一个进程需要读取块设备中的数据时,系统会......
  • JVM(Java虚拟机)、JMM(Java内存模型)笔记
    面试常见:请你谈谈你对JVM的理解?java8虚拟机和之前的变化更新?什么是OOM,什么是栈溢出StackOverFlowError?怎么分析?JVM的常用调优参数有哪些?内存快照如何抓取?怎么分析Dump文件?谈谈JVM中,类加载器你的认识?请你谈谈你对JVM的理解?JVM(Java虚拟机)是Java程序的运行环境,它允......
  • ProcDump工具的基本用法和功能,并掌握如何利用它进行进程监视、性能分析和故障排查,从而
    ProcDump初级应用的大纲:1.ProcDump简介与基本用法介绍ProcDump工具的基本作用和功能。演示如何使用ProcDump来监视进程并在满足指定条件时生成转储文件。2.进程监视与性能分析探讨如何使用ProcDump监视进程的CPU利用率、内存占用等性能指标。演示如何利用ProcDump生成......
  • VMMap工具的基本功能和使用方法,包括如何分析内存分配情况、监控内存使用模式等;包括深
    VMMap初级应用的大纲:1.介绍VMMap简要介绍VMMap是什么,以及其在Windows系统中的作用和用途。解释VMMap能够提供的信息类型,如内存分配情况、内存使用模式等。2.VMMap的基本功能演示如何使用VMMap打开目标进程,并查看其内存映射和分配情况。介绍VMMap提供的基本过滤器和查看......