Необходимо ускорить обработку большого набора данных в Pandas/Python с 8,5 секунд до 3-х.
Оптимизировав код Pandas, вижу следующие возможности:
1. Использовать несколько ядер процессора (Pandas использует только 1) и сделать параллельные вычисления. Пока для меня основная гипотеза, готов её пересмотреть.
2. Изменить процесс хранения и обработки данных (сейчас данные хранятся локально в Parquet и обрабатываются в Pandas)
Дано:
Сервер 4 ядра, 16 гб оперативки, возможно масштабирования (виртуальная машина)
1 большой набор данных (45 столбцов, 10 000 000 строк, хранение parquet), где лежат продажи по дням (2 года), по продуктам (500 позиций), по заказчикам (15 000 клиентов), по менеджерам (500 торговых), с дополнительной категоризацией и с разными мерами (шт, рубли, кг, скидка, наценка и т.п.).
Требуемый конечный результат:
более 20 маленьких таблиц для пользователей бизнес отчётов в разном разрезе.
Текущая скорость:
Шаг1. Чтение parquet с предварительной фильтрацией
2,5 секунды
pd.read_parquet('db.parquet', engine='pyarrow', filters=parquet_filter_list, columns=parquet_columns_list)
Шаг2. Подготовка 5 средних df в процессе Фильтрации -> Группировки -> Агрегации
4 секунды
df1= df1[columns].groupby(groupby_columns)[values_columns].sum().reset_index()
df2..
Шаг3. Для каждого из 5 средних df - подготовка по 3-5 финальных таблиц и передача их пользователю через fw Django
2 секунды
pivot_table_1 = pd.pvot_table..
Итого
8,5 секунд
Идея: сделать вычисление каждого из средних df, а также подготовку по ним маленьких таблиц, параллельно, используя несколько ядер процессора.
Поделитесь пожалуйста опытом параллельных вычислений с Pandas.
Если у Вас есть другие предложения по оптимизации - тоже пожалуйста поделитесь!