#python #tensorflow #amazon-s3 #aws-lambda #tar
#python #tensorflow #amazon-s3 #aws-lambda #tar
Вопрос:
У меня есть большой каталог объемом 1 ГБ с несколькими файлами, который хранится в S3 в формате tar.gz и управляется с помощью лямбда-функции.
Файловая система лямбда-функции доступна только для чтения. Поэтому я хотел бы, чтобы операции выполнялись в памяти.
Я не могу включить его в образ самой лямбда-функции, поскольку GitHub не принимает такие большие файлы.
Наличие лямбды для чтения его из S3 кажется разумным, но я не могу понять, как его распаковать. Извините, я новичок.
Вот что я написал:
# Define the resources to use
s3 = boto3.resource('s3', region_name='us-east-1')
bucket = s3.Bucket('tensorflow-models')
object = bucket.Object('saved-model.tar.gz')
# Prepare 2 file streams
file_stream1 = io.BytesIO()
file_stream2 = io.BytesIO()
# Download object to file stream
object.download_fileobj(file_stream1)
# Uncompress it
with tarfile.open(file_stream1, "r:gz") as tar:
tar.extractall(file_stream2)
# Use it in Tensorflow
model = tf.keras.models.load_model(file_stream2)
# Get the result
result = model.call(embedded_sentences)
Вот сообщение об ошибке:
{
"errorMessage": "expected str, bytes or os.PathLike object, not BytesIO",
"errorType": "TypeError",
"requestId": "xxxxxxxxxxxxxxxxxxx",
"stackTrace": [
" File "/var/task/app.py", line 87, in lambda_handlern with tarfile.open(file_stream1, "r:gz") as tar:n",
" File "/var/lang/lib/python3.9/tarfile.py", line 1629, in openn return func(name, filemode, fileobj, **kwargs)n",
" File "/var/lang/lib/python3.9/tarfile.py", line 1675, in gzopenn fileobj = GzipFile(name, mode "b", compresslevel, fileobj)n",
" File "/var/lang/lib/python3.9/gzip.py", line 173, in __init__n fileobj = self.myfileobj = builtins.open(filename, mode or 'rb')n"
]
}
Ответ №1:
Я не думаю, что вы можете работать с файлом объемом 1 ГБ из вашего лямбда-выражения, потому что в его временном каталоге есть ограничение в 512 МБ (пожалуйста, проверьте https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html )
Пожалуйста, проверьте наличие большого файла, смонтируйте EFS в лямбда-выражение или измените на логику (изучите другую возможность worker вместо lambda)