Я работаю с большим набором данных (~ 14 млн строк), используя поляры и столкнувшись с проблемами памяти, несмотря на использование потокового двигателя. Вот мой код: < /p>
import polars as pl
# Read CSV in streaming mode
df = pl.scan_csv("dummy_file.csv")
# Rename columns to lowercase
df = df.rename({col:col.lower() for col in df.collect_schema().names()})
# Select specific columns and features
df = df.select(['x','y','z','t'] + features)
# Create sin and cos columns for each feature
df = df.with_columns([pl.col(col).sin().alias(f'{col}_sin') for col in features] +
[pl.col(col).cos().alias(f'{col}_cos') for col in features])
# Create list column from all feature columns (original + sin + cos)
df = df.with_columns(pl.concat_list(df.collect_schema().names()[4:]).alias("features"))
# Compute outer products for the features list
df = df.with_columns([
pl.concat_list(
[pl.col("features").list.get(i) * pl.col("features") for i in range(len(features)*3)]
).alias("outer_products")
])
# Write to parquet
df.sink_parquet('test.parquet')
< /code>
Мой набор данных: < /p>
Первоначально имеет 42 столбца
фильтры до 40 столбцов
Создает SIN и COS столбцы для 36 функций , в результате чего дополнительные 72 столбца
вычисляют наружные продукты между всеми функциями < /p>
среда: < /p>
MacBook M1 с 16 ГБ оперативной памяти и 10 ядер
Polars 1.22
потоковой двигатель, включенный через переменную среды < /p>
, несмотря на использование потоковых возможностей Polar > Вопросы: < /p>
Как я могу оптимизировать этот код для более эффективной обработки большого набора данных?
Почему потоковая передача здесь не помогает? Операции кажутся независимыми от строки (внешний продукт каждой строки может быть вычислен независимо), но использование памяти растет до сбоя.
Есть ли альтернативные подходы к вычислению этих внешних продуктов, которые были бы более эффективными для памяти? < /P> < /p> < /p> < /p> < /p> < /p> < /p> br /> Дополнительный контекст: < /p>
Вычисление внешнего продукта создает матрицу для каждой строки, которая затем сглаживается
. Окончательная операция должна создавать LEN (функции)* 3 * len (функции) * 3 элемента на строку (так как мы умножаем оригинальные функции + sin + cos версии) < /p>
Я пробовал: < /p>
Использование режима потоковой передачи
witch непосредственно в Parquet с использованием sink_parquet
Удаление промежуточных шагов для уменьшения использования памяти < /p>
Любое понимание того, чтобы сделать это более эффективным для памяти при сохранении поляров ' Пособия по производительности будут очень оценены.
Подробнее здесь: https://stackoverflow.com/questions/794 ... arge-datas
Проблемы с памятью с потоковой передачей Polars при вычислении внешних продуктов в большом наборе данных » ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение