InfluxDB使用Flux函数aggregateWindow会占用大量内存

在使用InfluxDB的Flux函数aggregateWindow时,遇到内存占用剧增导致Docker容器卡死的情况。官方示例查询1万条数据即引发问题,而替换为等效脚本则能避免内存问题并保持高效运行。

aggregate函数定义

官方定义连接

aggregateWindow = (every, fn, columns=["_value"], timeColumn="_stop", timeDst="_time", tables=<-) =>
	tables
		|> window(every:every)
		|> fn(column:column)
		|> duplicate(column:timeColumn, as:timeDst)
		|> window(every:inf, timeColumn:timeDst)

使用示例:查询的数据输入只有1万条。

db = from(bucket: "mydata/autogen")
  |> range(start: -7d)
  |> filter(fn: (r) => r._measurement == "msd" and (r._field == "current")) 

db
  |> aggregateWindow(every: 50ms,fn:mean)

运行后,整个docker都会卡死,内存监控:
在这里插入图片描述
虚拟机分配内存直接用完,虚拟内存也疯狂读写,磁盘用量很大:
在这里插入图片描述

使用下面的等效脚本就不会出现这种问题,而且很快,内存占用和运行脚本前基本没有什么变化
db = from(bucket: "mydata/autogen")
  |> range(start: -7d)
  |> filter(fn: (r) => r._measurement == "msd" and (r._field == "current")) 

db
  |> window(every: 50ms)
  |> mean()
  |> duplicate(column:"_stop",as:"_time")
  |> window(every:inf)
### 使用 Flux 函数InfluxDB 中查询分页总数 为了计算总页面数,在 InfluxDB 中可以先获取符合条件的数据条目数量,再基于每页显示的记录数目来决定总的页面数。下面是一个具体的实现方法: #### 计算数据总量 首先定义一个用于统计特定条件下所有匹配项的数量的 Flux 查询脚本。 ```flux dataCount = from(bucket: "your-bucket-name") |> range(start: -1y) // 调整时间范围以适应需求 |> filter(fn: (r) => r["_measurement"] == "your-measurement" and r["tag-key"] == "tag-value") |> count() ``` 此部分代码会返回给定条件下的记录计数[^3]。 #### 定义每页大小并计算总页码 接着设定每一页应该展示多少条记录以及如何据此推导出总共需要几页才能完全展现这些数据。 ```flux pageSize = 100 // 假设每页有100条记录 totalPages = ceil(n: dataCount / float(v: pageSize)) ``` 这里 `ceil` 是向上取整操作符,用来处理当最后一组不足一整个页面的情况;而 `float()` 则是为了确保除法运算的结果能够被正确解析为浮点数值以便于后续计算[^2]。 最后完整的 Flux 查询语句如下所示: ```flux import "influxdata/influxdb/schema" // 获取满足条件的数据量 dataCount = from(bucket: "your-bucket-name") |> range(start: -1y) |> filter(fn: (r) => r["_measurement"] == "your-measurement" and r["tag-key"] == "tag-value") |> count() // 设置每页大小,并计算总页数 pageSize = 100 totalPages = ceil(n: dataCount / float(v: pageSize)) // 输出结果 table(totalPages) ``` 上述代码片段展示了怎样通过 Flux 编写逻辑去求解某个测量内指定标签值下所有的数据分成若干固定长度子集所需的最小集合个数——即所谓的“总页数”。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值