今日は、AWS Lambda, Python, 並列処理について書こうと思います。
背景
Lamdaでデータをダウンロードする時間を圧縮したい!
プログラム
下記の例では、awswranglerを用いて、S3から1000個のデータをダウンロードしてきます。 awsranglerについては、下記を参照ください。
LambdaでBoto3/Pandasを使うのをやめて、awswrangler(aws-sdk-pandas)を使いましょう - Yuta NakataのBlog
import concurrent.futures import awswrangler as wr def download(id: str): wr.s3.download(path=f's3://My-Bucket/test/{id}.json', local_file=f'/tmp/{id}.json') work_numbers = 100 filelist = list(np.arange(0, 1000, 1) with concurrent.futures.ThreadPoolExecutor(max_workers=work_numbers) as executor: executor.map(download, filelist)
ポイントは、以下の点です。
- download()関数で、ダウンロードするメソッドを定義
- work_numbersで同時実行する数を指定(ここでは、一度に100個のファイルを取得することを想定)。
- concurrent.futures.ThreadPoolExecutor()で並列でタスクを実行します
このプログラムによって、
1000回ダウンロードするプログラムではなく、100個並列に取得し、10個ダウンロードするプログラム
を実現しています。