拥有非常大限制的频道的成本

时间:2014-03-11 23:53:00

标签: go

基本上标题是什么。我想知道对通道大小有很大限制的缺点是什么

k := make(chan int, 100000000)

3 个答案:

答案 0 :(得分:6)

它将分配大量内存。在makechan实现中,我们可以看到它在您创建通道时完全分配了发送缓冲区:

http://code.google.com/p/go/source/browse/src/pkg/runtime/chan.goc#40

因此,对于您的具体示例,您将预先分配至少400MB(在32位系统上)或800MB(在64位系统上)的内存。

如果您发现自己需要超大型缓冲区,那么其他一些数据结构是否可能更适合您的需求?

答案 1 :(得分:4)

如果你真的需要一个大排队,但不是所有时间,那么如何让你自己成长/缩小?

func makeQueue() (enqueue chan<- int, dequeue <-chan int) {
    enq, deq := make(chan int), make(chan int)
    var queue []int
    go func() {
        for {
            if len(queue) == 0 {
                queue = append(queue, <-enq)
            }

            select {
            case v := <-enq:
                queue = append(queue, v)
            case deq <- queue[0]:
                queue = append([]int{}, queue[1:]...)
            }
        }
    }()
    return enq, deq
}

http://play.golang.org/p/q_Uw-E9NQb

警告:实施后,出列操作会复制整个底层切片。尽管在Go中复制是惯用的,但是分析可能会显示链接列表(如http://godoc.org/container/list)可能更快。您还可以安排从较大的块中提取队列,并从这些块中取出读取,从而减少复制操作。

答案 2 :(得分:2)

您也可以从渠道套餐中收集一些想法:https://github.com/eapache/channels

它支持在不使用多余空间的情况下增长的频道。它还具有批处理功能,听起来可能对您的目的有用。