如何优化处理大数据
How to optimise processing large data
我的后端服务objective是处理9000万条数据,1天至少1000万条数据。
我的系统配置:
- RAM 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)
}
在不了解您需要完成的工作类型的更多细节的情况下,您的方法似乎不错。需要考虑的一些事情:
在处理循环中重复使用变量和/或客户端。例如重用 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)
}
}
我找到了解决办法。为了实现如此巨大的处理,我所做的是
将 goroutine 的数量限制为 50 个,并将核心数量从 2 个增加到 5 个。
我的后端服务objective是处理9000万条数据,1天至少1000万条数据。
我的系统配置:
- RAM 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)
}
在不了解您需要完成的工作类型的更多细节的情况下,您的方法似乎不错。需要考虑的一些事情:
在处理循环中重复使用变量和/或客户端。例如重用 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)
}
}
我找到了解决办法。为了实现如此巨大的处理,我所做的是 将 goroutine 的数量限制为 50 个,并将核心数量从 2 个增加到 5 个。