Я читаю файлы из 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)