问题:
我需要对一个大型日志文件(几个GB长)的每一行应用多个正则表达式,收集非空匹配项,并将它们全部放入一个数组中(以进行序列化并通过网络发送)。
如果回答 this question 是肯定的,那么切片就没有太大的帮助:
因此,我考虑以下替代方案:
我需要对一个大型日志文件(几个GB长)的每一行应用多个正则表达式,收集非空匹配项,并将它们全部放入一个数组中(以进行序列化并通过网络发送)。
如果回答 this question 是肯定的,那么切片就没有太大的帮助:
由于可能会有成千上万的正则表达式匹配项,我无法预测切片的长度/容量。我也不能让它太大,“以防万一”,因为这样会浪费内存(或者不会吗?如果内存分配器足够聪明,不会分配太多未写入的内存,那么我可以使用巨大的切片容量而不会造成太大的伤害吗?)。如果切片没有足够的容量,追加操作将需要分配新的内存并复制旧的内容。对于长度小于1024的切片,它会将容量翻倍;对于长度大于1024的切片,它会将容量增加1.25倍。
因此,我考虑以下替代方案:
- 拥有一个双向链表的匹配列表 (http://golang.org/pkg/container/list/)
- 计算它的长度 (会用
len()
吗?) - 预分配一个具有该容量的切片
- 将字符串指针复制到此切片中
在 Go 中是否有更少费力的方法来实现这个目标(使用 ~ O(1) 的追加复杂度)?
(当然,我是 Go 语言的新手)
for i in range(10): print 'rows %.2f cumul %.2f' % (a, cumul),; cumul +=a; a=a*1.25
。结果:行 1.00 累计 0.00 行 1.25 累计 1.00 行 1.56 累计 2.25 行 1.95 累计 3.81 行 2.44 累计 5.77 行 3.05 累计 8.21 行 3.81 累计 11.26 行 4.77 累计 15.07 行 5.96 累计 19.84 行 7.45 累计 25.80。所以,如果我从1M行切片开始,并有800万个匹配项,那将需要复制切片10次,并且总共复制了25M行。与链表相比,这不是一个非常好的成本。 - LetMeSOThat4Ubytes
:http://play.golang.org/p/RiRqFLg8re 我不知道它是否比字符串切片更快,我认为它是字节切片,因此可能比字符串切片慢,但比连接字符串要快。这是另一个选择。 - siritinga