
今天我在我的 1 核 2g 云服务器上处理 20 多万 excel 数据的时候直接把内存搞爆了!程序直接 kill 了! 其 1. 我没想到会有这么多数据,所以对 excel 读取后的处理没有分割处理,直接 apped 追加到一个新数组再分割数组分批次入库 其 2. 有些我在传递的时候是值传递。在 for 循环 append 直接追加的值。后面我改成了
//指针传递 a := append(a, &a) 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.不是指针传递 := 赋值是不是又开辟了一块新内存存的相同的值,却不同内存地址
1 coderabbit OP fatal error: runtime: out of memory 内存爆了 目前我 defer recover 也无法捕获到。还有什么办法捕获到吗? |
2 labulaka521 2019 年 11 月 11 日 via Android 使用 channel 试试? |
3 GreatHumorist 2019 年 11 月 11 日 via iPhone append 每次是翻倍申请内存然后 copy 的吧,所以优化写法或者提前申请好空间 |
4 GGGG430 2019 年 11 月 11 日 temp 换成 map 类型试试, page 作为 key 递增 |
5 yangbin9317 2019 年 11 月 11 日 via iPhone 可以用 pprof 看看哪里 malloc 了多少内存,立刻就能定位问题 |
6 visitant 2019 年 11 月 11 日 append &报错是因为类型不匹配吧 var temp []*[]interface{} 然后 t := data[step:] temp = append(temp, &t) |
8 Carseason 2019 年 11 月 12 日 via iPhone append 会重新申请空间的 而且 for range 是遍历对象的拷贝,这样子也会消耗空间。 如果你要处理量大的最好先预先分配 |
9 noqwerty 2019 年 11 月 12 日 via Android pandas 他不香吗 |
10 coderabbit OP @visitant 我直接 append(temp, &data[:]) 报了错 就没移出来 谢了! |
11 coderabbit OP |