2

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))
}
4

1 に答える 1