我目前使用TransferManager从Lambda函数下载S3存储桶中的所有文件。
// Initialize
TransferManagerBuilder txBuilder = TransferManagerBuilder.standard();
// txBuilder.setExecutorFactory(() -> Executors.newFixedThreadPool(50));
TransferManager tx = txBuilder.build();
final Path tmpDir = Files.createTempDirectory("/tmp/s3_download/");
// Download
MultipleFileDownload download = tx.downloadDirectory(bucketName,
bucketKey,
new File(tmpDir.toUri()));
download.waitForCompletion();
return Files.list(tmpDir.resolve(bucketKey)).collect(Collectors.toList());
下载
300 seconds
(大小为10,000 files
)似乎要花费~20KB each
左右,这给我带来了大约666 KBps
的传输速率。增大线程池大小似乎完全不会影响传输速率。
S3终端节点和lambda函数位于同一AWS区域中,并且位于同一AWS账户中。
如何优化S3下载?
最佳答案
处理大量数据始终需要根据底层系统设计存储。
如果需要高吞吐量,则需要对s3键进行分区,以便它可以容纳大量请求。分布式计算具有自己的高性能需求,这就是这种需求之一。
请求速率注意事项:
https://docs.aws.amazon.com/AmazonS3/latest/dev/request-rate-perf-considerations.html
转移加速:
https://docs.aws.amazon.com/AmazonS3/latest/dev/transfer-acceleration.html
如何提高吞吐量:
https://aws.amazon.com/premiumsupport/knowledge-center/s3-bucket-performance-improve/
希望能帮助到你。
编辑1
我发现您正在尝试将文件下载到临时存储,因此需要了解存储限制。这些不用于批量处理。
https://docs.aws.amazon.com/lambda/latest/dg/limits.html