Прочитайте tar.gz сжатый файл сформируйте файловый поток, распакуйте его и поместите в другой файловый поток без записи на диск

#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)