请教一个 go 问题 append 追加! - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
coderabbit
V2EX    Go 编程语言

请教一个 go 问题 append 追加!
  •  1
     
  •   coderabbit 2019 年 11 月 11 日 4412 次点击

    这是一个创建于 2334 天前的主题,其中的信息可能已经有所发展或是发生改变。

    今天我在我的 1 核 2g 云服务器上处理 20 多万 excel 数据的时候直接把内存搞爆了!程序直接 kill 了! 其 1. 我没想到会有这么多数据,所以对 excel 读取后的处理没有分割处理,直接 apped 追加到一个新数组再分割数组分批次入库 其 2. 有些我在传递的时候是值传递。在 for 循环 append 直接追加的值。后面我改成了

    //指针传递 a := append(a, &a) 

    但是我在分割数组的时候 append &报错 这个方法有何改进的呢

    func SplitArr(data []interface{}, number int) [][]interface{} { //临时数据 var temp [][]interface{} //统计有多少数据 count := len(data) //每个子数组多少条数据 pageNumber := number //分割数量 page := int(math.Ceil(float64(count) / float64(pageNumber))) for i := 0; i < page; i++ { if i == page-1 { step := i * pageNumber temp = append(temp, data[step:]) } else if i == 0 { temp = append(temp, data[i:pageNumber]) } else { currentStep := i * pageNumber nextStep := currentStep + pageNumber temp = append(temp, data[currentStep:nextStep]) } } return temp } 

    还有问题想问

    1.我在 for range 的时候不是指针追加 是不是循环的时候内存越增越大?? 2.不是指针传递 := 赋值是不是又开辟了一块新内存存的相同的值,却不同内存地址

    11 条回复    2019-11-12 20:09:22 +08:00
    coderabbit
        1
    coderabbit  
    OP
       2019 年 11 月 11 日
    fatal error: runtime: out of memory 内存爆了 目前我 defer recover 也无法捕获到。还有什么办法捕获到吗?
    labulaka521
        2
    labulaka521  
       2019 年 11 月 11 日 via Android
    使用 channel 试试?
    GreatHumorist
        3
    GreatHumorist  
       2019 年 11 月 11 日 via iPhone
    append 每次是翻倍申请内存然后 copy 的吧,所以优化写法或者提前申请好空间
    GGGG430
        4
    GGGG430  
       2019 年 11 月 11 日
    temp 换成 map 类型试试, page 作为 key 递增
    yangbin9317
        5
    yangbin9317  
       2019 年 11 月 11 日 via iPhone
    可以用 pprof 看看哪里 malloc 了多少内存,立刻就能定位问题
    visitant
        6
    visitant  
       2019 年 11 月 11 日
    append &报错是因为类型不匹配吧

    var temp []*[]interface{}
    然后
    t := data[step:]
    temp = append(temp, &t)
    visitant
        7
    visitant  
       2019 年 11 月 11 日
    @visitant 试下这样写之后内存是怎么分配的?
    Carseason
        8
    Carseason  
       2019 年 11 月 12 日 via iPhone
    append 会重新申请空间的
    而且 for range 是遍历对象的拷贝,这样子也会消耗空间。
    如果你要处理量大的最好先预先分配
    noqwerty
        9
    noqwerty  
       2019 年 11 月 12 日 via Android
    pandas 他不香吗
    coderabbit
        10
    coderabbit  
    OP
       2019 年 11 月 12 日
    @visitant 我直接 append(temp, &data[:]) 报了错 就没移出来 谢了!
    coderabbit
        11
    coderabbit  
    OP
       2019 年 11 月 12 日
    @yangbin9317 谢了 找到这条技能了
    @Carseason 谢谢,后面根据情况来预先分配
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1303 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    UTC 23:51 PVG 07:51 LAX 16:51 JFK 19:51
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86