Go 同时从S3下载多个文件并合并它们

Go 同时从S3下载多个文件并合并它们,go,aws-sdk,aws-sdk-go,Go,Aws Sdk,Aws Sdk Go,我试图同时从S3下载多个文件,并将其内容整合到字节缓冲区中。这些文件是csv格式的。我的代码似乎大部分时间都能正常工作(10次尝试中有8次),但在我检查了整合缓冲区后,我得到的比我应该得到的少(通常不超过100行)。预计记录总数为4802。 如果按顺序运行我的代码,则不会出现此问题。但我需要使用goroutines来提高速度。这是我尝试执行的主要要求。我已运行go data race inspector,但没有出现任何数据竞争,并且我打印的错误语句从未打印出来 这是我使用的代码: var

我试图同时从S3下载多个文件,并将其内容整合到字节缓冲区中。这些文件是csv格式的。我的代码似乎大部分时间都能正常工作(10次尝试中有8次),但在我检查了整合缓冲区后,我得到的比我应该得到的少(通常不超过100行)。预计记录总数为4802。 如果按顺序运行我的代码,则不会出现此问题。但我需要使用goroutines来提高速度。这是我尝试执行的主要要求。我已运行go data race inspector,但没有出现任何数据竞争,并且我打印的错误语句从未打印出来

这是我使用的代码:

    var pingsBuffer = aws.NewWriteAtBuffer([]byte{}) 
        //range over the contents of the index file
    for _, file := range indexList {
        wg.Add(1)
        go download(key + string(file), pingsBuffer, &wg)
    }
    wg.Wait()
和下载功能(也整合下载的文件)

此代码:

lenghts3:= int64(len(buffer.Bytes()))
这是一个并发问题:两个例程可能同时获得长度,获得相同的起始位置,并且都以相同的起始位置继续写入缓冲区,相互踩着对方的脚

因为您已经在内存中检索整个对象,而不是流式传输到组合缓冲区,所以您也可以在通道上发送每个文件的完整内容,并让该通道上的接收器在每个结果进入时同步地将其附加到共享字节缓冲区

lenghts3:= int64(len(buffer.Bytes()))