如何优化处理大数据

时间:2021-02-11 05:37:12

标签: go optimization goroutine

我的后端服务的目标是在 1 天内处理 9000 万条数据和至少 1000 万条数据。

我的系统配置:

  • 内存 2000 Mb
  • CPU 2 核

我现在正在做的事情是这样的:

var wg sync.WaitGroup
//length of evs is 4455
for i, ev := range evs {
                wg.Add(1)
                go migrate(&wg)
            }
wg.Wait()

func migrate(wg *sync.WaitGroup) {
defer wg.Done()
//processing 
time.Sleep(time.Second)
}

2 个答案:

答案 0 :(得分:0)

在不了解您需要完成的工作类型的更多细节的情况下,您的方法似乎不错。一些需要考虑的事情:

  • 在处理循环中重用变量和/或客户端。例如重用一个 HTTP 客户端而不是重新创建一个。

  • 取决于您的用例调用处理故障的方式。使用 erroGroup 可能更有效。这是一个方便的包装器,可以在出错时停止所有线程,可能会为您节省大量时间。

  • 在迁移函数中,请务必注意有关 closure and goroutines 的注意事项。

func main() {
    g := new(errgroup.Group)
    var urls = []string{
        "http://www.someasdfasdfstupidname.com/",
        "ftp://www.golang.org/",
        "http://www.google.com/",
    }
    for _, url := range urls {
        url := url // https://golang.org/doc/faq#closures_and_goroutines
        g.Go(func() error {
            resp, err := http.Get(url)
            if err == nil {
                resp.Body.Close()
            }
            return err
        })
    }

    fmt.Println("waiting")
    if err := g.Wait(); err == nil {
        fmt.Println("Successfully fetched all URLs.")
    } else {
        fmt.Println(err)
    }
}

答案 1 :(得分:-1)

我已经找到了解决方案。为了实现如此巨大的处理,我所做的是 将有限数量的 goroutine 限制为 50 个,并将内核数量从 2 个增加到 5 个。