TonyChyi

我在那一角落患过抽风

实现一个类似RRDTool的算法
2016年05月06日
 

 

RRDTool 中有一种算法:

  • 每周的数据按每天汇总
  • 每月的数据按每周汇总
  • 每年的数据按每月汇总

或者说实现以下需求:

  1. 时间在三个月以内的,保留全部
  2. 时间在3-6个月的,每天保留一个
  3. 时间在6-9个月的,每周保留一个

基本的思路如下:

  1. 选取所定义的时间范围的所有内容a[],时间差为s
  2. a[0]定义为基准元素
  3. 遍历元素,与基准元素时间差< s的,删除
  4. 与基准元素时间差>= s的,该元素成为新的基准元素

以下是一个演示程序,生成一个1-100的数组,然后按照一定的策略删除(置0)其中的元素。

package main

import (
	"fmt"
)

var a []int

func init() {
	for i := 1; i <= 100; i++ {
		a = append(a, i)
	}
}

func main() {
	fmt.Println("Origin:", a, "\n")
	b := make([]int, 0)
	baseLine := a[0] // 基准值
	for i, _ := range a {
		if i < 10 {
			b = append(b, a[i])
			baseLine = a[i]
			continue
		}
		if i >= 10 && i < 30 {
			if a[i]-baseLine >= 2 {
				baseLine = a[i] // 更新基准值
				b = append(b, a[i])
				continue
			}
			a[i] = 0
		}
		if i >= 30 && i <= 50 {
			if a[i]-baseLine >= 5 {
				baseLine = a[i]
				b = append(b, a[i])
				continue
			}
			a[i] = 0
		}
		if i >= 50 {
			if a[i]-baseLine >= 10 {
				baseLine = a[i]
				b = append(b, a[i])
				continue
			}
			a[i] = 0
		}
	}
	fmt.Println("Proceed:", a, "\n")
	fmt.Println("Human:", b)
}
Tags: #Go · #RRDTool

 

TonyChyi © 2020 GPLv2