【问题标题】:Disk-backed array in GoGo 中的磁盘支持数组
【发布时间】:2013-08-04 17:18:57
【问题描述】:

如何在 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)
        })
    })
}

【问题讨论】:

    标签: memory go fifo task-queue


    【解决方案1】:

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

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

    【讨论】:

    • godoc.org/github.com/cznic/kv#DB.First - 如何首先选择?它是最早输入的 k,v 仍然存在于数据库中吗?顺便说一句,如果我需要在应用程序中添加持久性,您的 kv 看起来非常适合代码的另一部分。
    • @sajal:第一:按密钥整理顺序。所以是的,如果你使用有序数字序列(或 time.Now().UnixNano())作为键,那么 .First 将返回仍在数据库中的“最旧”项。
    猜你喜欢
    • 2019-06-19
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    • 2019-07-10
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多