Как прочитать большие файлы gzip csv из хранилища Azure в памяти в aws lambda?

#python #amazon-web-services #aws-lambda #azure-blob-storage

#python #amazon-веб-сервисы #aws-lambda #azure-blob-хранилище

Вопрос:

Я пытаюсь преобразовать большие файлы gzip csv (> 3 гигабайт) из большого двоичного объекта хранилища Azure, загрузив его в фрейм данных pandas в функции AWS Lambda.

Локальная машина с 16 гигабайтами может обрабатывать мои файлы, но выдает ошибку памяти «ErrorType»: «MemoryError», при выполнении в aws lambda, поскольку максимальная память lambda составляет 3 Гб.

Есть ли какой-либо способ чтения и обработки этих больших данных в памяти в aws lambda. Просто упомяну, что я также пробовал stream way, но безуспешно.

Ниже приведен мой пример кода-

 from azure.storage.blob import *
import pandas as pd
import gzip

blob = BlobClient(account_url="https://"   SOURCE_ACCOUNT   ".blob.core.windows.net",
                          container_name=SOURCE_CONTAINER,
                          blob_name=blob_name,
                          credential=SOURCE_ACCT_KEY)
    
data = blob.download_blob()
data = data.readall()
    
unzipped_bytes = gzip.decompress(data)
unzipped_str = unzipped_bytes.decode("utf-8")
df = pd.read_csv(StringIO(unzipped_str), usecols=req_columns,low_memory=False)
  

Комментарии:

1. Почему lambda? Это не кажется хорошим выбором для этой задачи из-за его ограничений. А как насчет времени обработки? Lambda может работать только в течение 15 минут? Этого было бы достаточно, даже если бы вы могли загрузить в него свои данные?

2. Если вам не нужен контекст всего файла для преобразования, возможно, вы могли бы каким-то образом распаковывать его по частям. Возможно, эта суть могла бы быть полезной, в частности, строка 31.

3. @Marcin Что еще вы предлагаете, если не Lambda, я не хочу использовать ECS-кластер, прежде чем исчерпывать потоковую передачу данных в памяти. Я знаю об ограничении выполнения и памяти lambda, поэтому я спросил об этом. Я знаю, что люди обрабатывают большие файлы в функции lambda vis step для файлов S3, но azure blob, который находится в сжатом формате, является моей проблемой. Пожалуйста, предложите любое решение, если у вас есть. Спасибо.

Ответ №1:

Попробуйте использовать фрагменты и считывать данные по n строк за один раз:

 for chunk in pd.read_csv("large.csv", chunksize=10_000):
    print(chunk)
  

Хотя, я не уверен насчет сжатых файлов. В худшем случае вы можете распаковать данные и затем читать фрагментами.

Комментарии:

1. Дана, ваше предложение верно, но, как я упоминал в своем посте, я делаю это в своем локальном ans, способном обработать это без каких-либо проблем. Спасибо