Polars LazyFrame мойка_паркет + PartitionByKey медленнее для S3, чем локальный дискPython

Программы на Python
Anonymous
 Polars LazyFrame мойка_паркет + PartitionByKey медленнее для S3, чем локальный диск

Сообщение Anonymous »

Мне интересно, почему я наблюдаю такую ​​низкую производительность при написании LazyFrame с использованием PartitionByKey для S3 по сравнению с другими методами. Вот простой тестовый скрипт, который записывает случайные данные на диск и в S3:

Код: Выделить всё

import time

import polars as pl
import numpy as np

l = 600_000_000

data = pl.DataFrame({"a": np.random.randint(0, 100, l),
"b": np.random.randint(0, 100, l)})

t0 = time.time()
data.write_parquet("/tmp/in-memory.parquet",
compression="zstd", compression_level=6)
t1 = time.time()

print(f"in-memory, local write: {t1-t0:0.2f}s")

t0 = time.time()
data.write_parquet("s3://bucket/in-memory.parquet",
compression="zstd", compression_level=6)
t1 = time.time()

print(f"in-memory, s3 write: {t1-t0:0.2f}s")

lazy = data.lazy()

t0 = time.time()
lazy.sink_parquet(
pl.PartitionByKey(
base_path="/tmp/lazy",
file_path=lambda ctx: f"{ctx.keys[0]}.parquet",
by="a",
include_key=True),
mkdir=True,
compression="zstd",
compression_level=6,
maintain_order=False,
)
t1 = time.time()

print(f"lazy, local write: {t1-t0:0.2f}s")

t0 = time.time()
lazy.sink_parquet(
pl.PartitionByKey(
base_path="s3://bucket/lazy/",
file_path=lambda ctx: f"{ctx.keys[0]}.parquet",
by="a",
include_key=True),
mkdir=True,
compression="zstd",
compression_level=6,
maintain_order=False,
)
t1 = time.time()

print(f"lazy, s3 write: {t1-t0:0.2f}s")
Я запускаю это на экземпляре AWS EC2 r8g.xlarge, который имеет 4 ядра и подключен по умолчанию к диску gp3 со скоростью 125 МБ/с. Это означает, что скорость сети («до 12,5 Гбит/с») выше, чем у диска. Я использую версию Polars 1.34.0. Вот пример вывода:

Код: Выделить всё

in-memory, local write: 11.13s
in-memory, s3 write: 5.34s
lazy, local write: 3.73s
lazy, s3 write: 18.62s
Первые три записи имеют смысл: добавление большего количества ядер или более быстрая сеть дают более быстрые результаты. Почему последняя запись для LazyFrame, переходящая на S3, выполняется настолько медленнее? Если я понимаю, он должен быть самым быстрым, потому что он может: а) использовать все ядра и б) использовать сеть быстрее, чем диск. Я делаю что-то не так? Что мне не хватает?

Подробнее здесь: https://stackoverflow.com/questions/797 ... local-disk

Вернуться в «Python»