从S3下载大文件到Lambda在没有线程的情况下速度更快



我正试图在Lambda中下载带有python代码的15GB大小的二进制文件(到EFS,因为/tmp的限制为500MB(,但它花费了太多时间,所以我出现了超时错误(Lambda的限制为15分钟(。

为了轻松调试代码,我正在使用470MB的文件(abc.tar(和/tmp

我正在尝试使用多部分下载来加快下载文件的代码。

这是我的无线程脚本:

import json
import boto3
import time
import os
from boto3.s3.transfer import TransferConfig
s3 = boto3.client('s3')
def lambda_handler(event, context):
s_t = time.time()
config = TransferConfig(use_threads=False)
s3.download_file('my_bucket', 'abc.tar', '/tmp/abc.tar', Config=config)
print("time: ", time.time() - s_t) #print time took to download_file
return{
"statusCode": 200
}

下载abc.tar花了25秒。

当我将配置更改为use_threads=True时,花了45秒(我运行了几次(。这让我非常惊讶,因为我认为线程应该让它更快。

尽管如此,我还是尝试使用这个配置(正如从这篇中期文章中看到的那样(与多部分+线程:

config = TransferConfig(multipart_threshold=1024*20, max_concurrency=3, multipart_chunksize=1024*20, use_threads=True)

我得到了暂停(70秒后(。

如何使多部分更快地下载文件

如果你只是想做一次一次性传输,最好使用DataSync来完成。这将允许你从S3传输到EFS(反之亦然(。你只需要一个EC2实例上的代理和它的任务

来自文件:

数据迁移–通过网络将活动数据集快速移动到Amazon S3、Amazon EFS或适用于Windows文件服务器的Amazon FSx中。

你想在Lambda中这样做有什么原因吗?一旦它在EFS中,您是否需要将它转移到S3(或再次从S3转移到EFS(?

最新更新