#pandas #performance #parquet #codegems
Как побыстрее прочитать много файлов данных паркет (с одной схемой) и объединить их в один фрейм данных в памяти?
Базовое решение в Pandas (работает последовательно, грузит лишь 1 ядро):
И сразу лучшие решения.
Pandas с многопоточной загрузкой:
Сработало вдвое быстрее последовательного пандас.
Polars:
На моих файлах это не сработало, т.к. у меня некоторые поля записались по-разному как float32/float64, и поларс не смог их состыковать. Запросил эту фичу. Но зато уже сработало
причем вдвое быстрее мультипоточного панадас! Грузило CPU на 100%.
Если файлы с трудом влезают в оперативку, и на слияние уже не хватает RAM, можно их сначала последовательно записать в 1 большой файл, и уже потом открыть разом (работает в 5 раз медленнее худшего из предыдущих вариантов, но не требует RAM):
Как побыстрее прочитать много файлов данных паркет (с одной схемой) и объединить их в один фрейм данных в памяти?
Базовое решение в Pandas (работает последовательно, грузит лишь 1 ядро):
df =pd.concat([pl.read_parquet(file) for file in files], ignore_index=True)
И сразу лучшие решения.
Pandas с многопоточной загрузкой:
with concurrent.futures.ThreadPoolExecutor() as executor:
df = pd.concat([future.result() for future in concurrent.futures.as_completed([executor.submit(pd.read_parquet, file) for file in files])], ignore_index=True)
Сработало вдвое быстрее последовательного пандас.
Polars:
df = pl.read_parquet( f"mask*.parquet"))
На моих файлах это не сработало, т.к. у меня некоторые поля записались по-разному как float32/float64, и поларс не смог их состыковать. Запросил эту фичу. Но зато уже сработало
df =pl.concat([pl.read_parquet(file) for file in files], how="vertical_relaxed")
причем вдвое быстрее мультипоточного панадас! Грузило CPU на 100%.
Если файлы с трудом влезают в оперативку, и на слияние уже не хватает RAM, можно их сначала последовательно записать в 1 большой файл, и уже потом открыть разом (работает в 5 раз медленнее худшего из предыдущих вариантов, но не требует RAM):
schema = pq.ParquetFile(files[0]).schema_arrow
with pq.ParquetWriter(join(datapath, "output.parquet"), schema=schema) as writer:
for file in files:
writer.write_table(pq.read_table(file, schema=schema))
GitHub
Allow passing pl.concat kwargs to pl.read_csv, read_parquet etc · Issue #12508 · pola-rs/polars
Description Correct me if I'm wrong but it seems that currently when reading files by the mask, read_csv, read_parquet etc fall with error on, say, shape mismatch, or fp32 vs fp64 dtypes mismat...
🔥2
#duckdb #polars #performance
https://towardsdatascience.com/python-one-billion-row-challenge-from-10-minutes-to-4-seconds-0718662b303e
https://towardsdatascience.com/python-one-billion-row-challenge-from-10-minutes-to-4-seconds-0718662b303e
Towards Data Science
Python One Billion Row Challenge - From 10 Minutes to 4 Seconds | Towards Data Science
The one billion row challenge is exploding in popularity. How well does Python stack up?