【发布时间】:2015-07-07 01:17:19
【问题描述】:
我正在深入研究 Golang,遇到一个问题,我已经研究了几天,但我似乎无法掌握 Go 例程的概念以及它们的使用方式。
基本上,我正在尝试生成数百万条随机记录。我有生成随机数据的函数,并将创建一个包含这些数据的巨大 .CSV 文件。
我的问题是是否有可能使这个并发并加快速度?
我的代码基本上是生成一个随机字符串,将字符串写入文件最多 N 次(其中 N 是你想要的任何东西)。
我的问题是是否可以同时执行此操作以减少执行时间。似乎无论我如何处理这个问题,我仍然得到相同的基准,就好像我没有使用 goroutine 一样。
这是我目前所拥有的示例:
func worker(c chan string) {
for {
c <- /* Generate random data using other functions here */
}
close(c)
}
func writer(s string) {
csvfile.WriteString(s)
}
func main(){
receive := make(chan string)
for i := 0; i < 100; i++ {
go worker(receive)
}
for i := 0; i < 10000; i++ {
go writer(<-receive)
}
}
在我生成数据的地方,我使用了大量来自:https://github.com/Pallinder/go-randomdata 的函数调用。你认为这可能是我一直输的地方吗?
任何帮助将不胜感激。
【问题讨论】:
-
请注意,默认的随机数生成器对于并发使用是安全的,它通过锁定来实现。如果您在 goroutine 中使用大量随机数,您希望通过为每个 goroutine 设置一个隔离的
*math.Rand来避免它们序列化对随机数的访问。你可以通过rand.New(和rand.NewSource,每个课程使用不同的种子)来做到这一点。 -
切向相关:加快文件写入的最快方法是使用一个大 fwrite 一次写入所有文件,如果您需要更快,那么您可以考虑关闭处理器中的内部缓冲缓存和硬盘缓存,我认为这通常取决于系统。如果你真的很详细,你可能需要一种较低级别的语言,比如 C
标签: go