Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon Golang の S3 への大きなファイルのアップロードに前方専用リーダーを使用できますか?


Golang の S3 への大きなファイルのアップロードに前方専用リーダーを使用できますか?


検索結果によると、AWS SDK for Go を使用して大きなファイルを Amazon S3 にアップロードする場合、Go `tar` リーダーなどの前方専用リーダーの使用は困難になる可能性があるようです。

重要なポイントは次のとおりです。

1. メモリ管理の問題: AWS SDK for Go の S3 アップローダーは、アップロードする前にファイル全体にチャンク バッファを割り当てて埋めます。これにより、Go の tar リーダーなどの `Seek` または `ReadAt` 関数をサポートしていないリーダーを使用して大きなファイルをアップロードすると、プロセスでメモリ不足が発生する可能性があります。

2. インテリジェント チャンキング: GitHub の問題 #1104 は、SDK が改善されて、よりインテリジェントなチャンキングが使用される可能性があることを示唆しています。 `Seek` と `ReadAt` をサポートしていないリーダーを処理します。これにより、大きなファイルのアップロード中のメモリ使用量をより適切に管理できるようになります。

3. ストリーミングとマルチパート アップロード: AWS SDK for Go はストリーミングとマルチパート アップロードをサポートしており、大きなファイルのアップロード時のメモリ使用量の管理に役立ちます。ただし、これらの機能は、順方向専用リーダーではうまく機能しない可能性があります。

4. 代替ソリューション: 検索結果では、S3 への大きなファイルのストリーミングをより適切にサポートしている可能性がある Minio SDK または Google CDK の使用を提案しています。さらに、aws-s3-reader-seeker プロジェクトは、大規模な S3 オブジェクトをさらに処理できるカスタム リーダー実装を提供します。効率的に。

要約すると、AWS SDK for Go を使用して大きなファイルを S3 にアップロードするには、Go の「tar」リーダーのような前方専用リーダーを使用することは可能ですが、これは最も効率的でメモリに優しいアプローチではない可能性があります。このような場合には、代替ソリューションを検討するか、SDK のストリーミングおよびマルチパート アップロード機能を使用する方が良い選択肢になる可能性があります。

引用:
[1] https://github.com/aws/aws-sdk-go/issues/1104
[2] https://github.com/nikolaydubina/aws-s3-reader/blob/master/aws_s3_reader_seeker.go
[3] https://www.reddit.com/r/golang/comments/131bq42/need_to_stream_large_files_to_s3_using_go/
[4] https://www.linkedin.com/pulse/golang-uploading-files-aws-s3-bucket-using-pre-signed-tiago-melo
[5] https://pkg.go.dev/github.com/SnellerInc/sneller/aws/s3