Go中的磁盘支持的数组

时间:2013-08-03 14:20:55

标签: memory go fifo task-queue

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

1 个答案:

答案 0 :(得分:0)

听起来像embedded database的工作。我确信FIFO可以很容易地通过例如建模。 NoSQL键/值存储。

您可能需要查看kv(此处作者)。捕获:值限制为64k,因此您可能需要从多个K / V对中组合单独的FIFO项。