gpt4 book ai didi

戈朗 : remove structs older than 1h from slice

转载 作者:IT王子 更新时间:2023-10-29 02:00:43 26 4
gpt4 key购买 nike

所以我正在构建一个小型实用程序,它在套接字上监听并将传入的消息作为结构存储在 slice 中:

var points []Point

type Point struct {
time time.Time
x float64
y float64
}

func main() {
received = make([]Point, 0)
l, err := net.Listen("tcp4", ":8900")
// (...)
}


func processIncomingData(data string) {

// Parse icoming data that comes as: xValue,yValue
inData = strings.Split(data, ",")
x, err := strconv.ParseFloat(inData[0], 64);
if err != nil {
fmt.Println(err)
}
y, err := strconv.ParseFloat(inData[1], 64);
if err != nil {
fmt.Println(err)
}

// Store the new Point
points = append(points, Point{
time: time.Now(),
x: x,
y: y,
})

// Remove points older than 1h ?

}

现在,正如您想象的那样,这将很快填满我的 RAM。 在添加每个新点后删除早于 1 小时的点的最佳方法(执行速度更快)是什么?我将获得同龄人每秒 10-15 倍的新积分。

谢谢。

最佳答案

我多次使用的一种方法是在项目早期启动一个 goroutine,看起来像这样:

go cleanup()

...

func cleanup() {
for {
time.Sleep(...)
// do cleanup
}
}

然后你可以做的是遍历 points使用 time.Since(point.time)计算出每条数据的年龄。如果它太旧,则有一个 slice trick从给定位置的 slice 中删除项目:

points = append(points[:i], points[i+1:]...)

(其中 i 是要删除的索引)

因为这些点是按照它们被添加的时间顺序排列在 slice 中的,所以您可以通过简单地找到第一个不到一小时的索引并执行 points = points[i:] 来加快速度。从 slice 的开头切掉旧点。

如果您在清理数组时收到访问数组的请求,您可能会遇到问题。添加 sync.Mutex可以帮忙。只需在清理之前锁定互斥锁,并尝试在写入数组的其他任何地方锁定互斥锁。但这可能是过早的优化。在添加互斥量之前,我会在没有互斥量的情况下进行试验,因为这会有效地与 points 进行交互。串行操作并减慢服务速度。

time.Sleep(...)在循环中是为了防止过于频繁地清洁。您可能想将它设置为一个小时,因为您想要删除早于该时间的点,但最终可能会遇到在清理后立即添加一个点的情况。在下一次清理时,它将有 59 分钟的历史,而您不删除它,在下一次清理中,它有将近 2 小时的历史。我的经验法则是,我尝试每 1/10 的时间清理一次我希望允许对象保留在内存中的时间,但这是相当随意的。这种方法意味着一个对象在删除时最多可以存在 1 小时 5 米 59 秒。

关于戈朗 : remove structs older than 1h from slice,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55911261/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com