Yuta NakataのBlog

Python / AWS / ITについて役立つ情報を発信します

AWS Lambdaで複数のファイルを並列で取得する

今日は、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個ダウンロードするプログラム

を実現しています。