gpt4 book ai didi

memory - Go 中的磁盘备份数组

转载 作者:数据小太阳 更新时间:2023-10-29 03:29:27 24 4
gpt4 key购买 nike

如何在 Go 中创建基于磁盘的延迟队列?

我正在编写一个 Go 程序,以便在特定时间间隔后对数据执行特定操作。这是精简版。

func IncomingJob (data MyStruct) {
//Run immediately
dosomething(&data, 1)
time.Sleep(5 * time.Minute)
//Run after 5 minutes has passed from initial arrival
dosomething(&data, 2)
time.Sleep(5 * time.Minute)
//Run after 10 minutes has passed from initial arrival
dosomething(&data, 3)
time.Sleep(50 * time.Minute)
//Run after 60 minutes has passed from initial arrival
dosomething(&data, 4)
}

这个函数将被初始化为一个 goroutinue。

go IncomingJob(data)

我遇到的问题是 IncomingJob 的每个实例都运行 60 分钟,而 MyStruct 对象在此期间保留在内存中。总内存使用量非常大。如果我想支持每小时 100 万次运行,这意味着在任何给定时间,内存中都有 100 万个 MyStruct 对象在等待,什么都不做。我也可以为此使用 time.AfterFunc,但这不会改变内存使用方面的任何内容。

Go 中是否有一些磁盘支持的 FIFO 队列/缓冲区实现?这样我就可以有 3 个队列(用于不同的时间间隔)并对其进行轮询并休眠,直到轮询数据被重新处理的正确时间。这样我会在序列化中损失一些 CPU 周期,将 I/O 延迟添加到内存中的应用程序,但会节省大量内存。

更新:time.AfterFunc 使用更少的内存。

func IncomingJob (data MyStruct) {
//Run immediately
dosomething(&data, 1)
time.AfterFunc(5 * time.Minute, func() {
//Run after 5 minutes has passed from initial arrival
dosomething(&data, 2)
time.AfterFunc(5 * time.Minute, func() {
//Run after 10 minutes has passed from initial arrival
dosomething(&data, 3)
})
time.AfterFunc(50 * time.Minute, func() {
//Run after 50 minutes has passed from initial arrival
dosomething(&data, 4)
})
})
}

最佳答案

听起来像是一份 embedded database 的工作.我敢肯定,例如,可以很容易地对 FIFO 进行建模。 NoSQL 键/值存储。

您可能想看看 kv (作者在这里)。 Catch:值限制为 64k,因此您可能需要从多个 K/V 对中组成单独的 FIFO 项目。

关于memory - Go 中的磁盘备份数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18033790/

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