S3 から複数のファイルを同時にダウンロードし、その内容をバイト バッファーに統合しようとしています。ファイルは csv 形式です。私のコードはほとんどの場合 (10 回の試行で 8 回) 動作するように見えますが、統合されたバッファーを調べた後、得られるはずのものより少ない (通常は 100 行以下) 場合があります。予想されるレコードの総数は 4802 です。コードを順番に実行すると、この問題は発生しません。しかし、速度のためにゴルーチンを使用する必要があります。これは、何をしようとしているかの主要な要件です。データ競合は表示されず、印刷したエラーステートメントは印刷されません。
これは私が使用するコードです:
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()
およびダウンロード機能 (ダウンロードしたファイルも統合します)
func download(key string, buffer *aws.WriteAtBuffer, wg *sync.WaitGroup) {
defer wg.Done()
awsBuffer := aws.NewWriteAtBuffer([]byte{})
input := &s3.GetObjectInput {
Bucket: aws.String(defaultLocationRootBucket),
Key: aws.String(key),
}
n1, downloadError := downloader.Download(awsBuffer, input)
if downloadError != nil {
loglib.Log(loglib.LevelError, applicationType, fmt.Sprintf("Failed to download from S3, file(%v) with error : %v.", key, downloadError))
return
}
lenghts3:= int64(len(buffer.Bytes()))
n2, bufferError := buffer.WriteAt(awsBuffer.Bytes(), lenghts3 )
if bufferError != nil {
loglib.Log(loglib.LevelError, applicationType, fmt.Sprintf("Failed to write to buffer, the file(%v) downloaded from S3 with error : %v.", key, bufferError))
}