Как исправить проблему с памятью при чтении паркета в Pandas - PullRequest
0 голосов
/ 24 сентября 2019

Я читаю файлы из S3 во фрейм данных Pandas: файлы являются паркетами, которые были разделены.Я буду использовать это внутри Lambda, поэтому я должен быть очень консервативен с памятью.Когда я запускаю следующую инструкцию, мне не хватает памяти:

pq.ParquetDataset(f's3://{path}', filesystem=s3).read_pandas().to_pandas()

Однако, если я запускаю следующую команду, у меня все хорошо:

pq.ParquetDataset(f's3://{path}', filesystem=s3)

Затем он снова ломается, если добавить:

pq.ParquetDataset(f's3://{path}', filesystem=s3).read_pandas()

Размер несжатых данных составляет 500 МБ, а у меня 3 ГБ ОЗУ.Есть ли более эффективный способ памяти, чтобы вытянуть серию паркетов в Pandas Dataframe?

Что-то еще, что я пробовал:

Это не сработало, потому что оно ломалось, еслисодержит слишком длинные строки:

for obj in bucket.objects.filter(Prefix=f'{prefix}'):
    obj = s3_resource.Object(buckey,obj.key)
    obj.download_fileobj(buffer)
    df = pd.read_parquet(buffer)

Еще одна попытка, которая не работает:

def memory_optimized_pull(datekey, filter_column, filter_column_value):
    s3_resource = boto3.resource('s3')
    bucket_name = 'bn'
    bucket = s3_resource.Bucket(name=bucket_name)
    df_list = []
    for obj in bucket.objects.filter(Prefix=...):
        f = s3.open(f'{bucket_name}/{obj.key}')
        df = pq.read_table(f).to_pandas()
        df = df[df[filter_column] == filter_column_value]
        df_list.append(df)
    return pd.concat(df_list, ignore_index=True, sort=False)

1 Ответ

0 голосов
/ 24 сентября 2019

Причина, по которой pq.ParquetDataset(f's3://{path}', filesystem=s3) не хватает памяти, заключается в том, что она ничего не загрузила.Он просто инкапсулирует подробности о том, как читать набор данных, но на самом деле ничего не делает, пока не вызовет read.

Когда вы говорите, что размер несжатых данных составляет 500 МБ, вы имеете в виду загрузку в память?Если это размер файла от s3, он, вероятно, сжат с помощью snappy (по умолчанию с pandas to_parquet).

В общем, паркет предназначен для больших наборов данных, а лямбды AWS не лучший выбор для более тяжелых заданий ETL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...