Оптимизация использования памяти для работы с большими LazyFrames с помощью Polars + Python

У меня есть приложение, в котором мне нужно работать с очень большим объемом данных. Я читал, что поляры должны иметь возможность работать с наборами данных, превышающими доступную память, поэтому я, должно быть, делаю что-то не так...

В моем сценарии приложение работает в контейнере Kubernetes, где я настроил его на использование 12 ГБ памяти. Я пытаюсь работать с данными из CSV с 200 миллионами записей, примерно ~9 ГБ на диске.

Основной формат этого CSV следующий:

id,aligned_value,date_reference,model,predict,segment
00000000001,564,20240520,XPTO,,3
00000000002,741,20240520,XPTO,,6
00000000003,503,20240520,XPTO,,5
00000000004,200,20240520,XPTO,,0

Я пытаюсь запустить простую и простую агрегацию для подсчета уникальных значений этого набора данных, сгруппированных по двум полям («aligned_value», которое варьируется от 0 до 1000, и сегменту, который идет от 0 до 6). Но когда я запускаю следующий код, потребление памяти увеличивается и увеличивается, пока контейнер просто не будет уничтожен.


   def get_summarized_base_df(self, filepath: str) -> pl.DataFrame:
        """
        Summarizes the base on a dataframe grouped by all fields included
        on this report's setup
        """

        # This part will return a list of fields, which for this scenario should be just ["aligned_value", "segment"]
        required_fields = self.list_all_required_fields()

        base_lf = pl.scan_csv(filepath)

        summarized_base_df = base_lf.group_by(required_fields).agg(pl.count()).collect()

        return summarized_base_df

Есть ли параметры, которые я мог бы использовать для уменьшения использования памяти? Я неправильно использую фреймворк?

Для справки, я пытался ограничить использование памяти поляров, установив переменную среды «POLARS_MAX_MEMORY_MIB», но, похоже, это не имело никакого значения.

Некоторая дополнительная информация:

Версия Python: 3.10.11 Версия Поларса: 0.20.18

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
117
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Для точек стиля вы можете использовать .len() вместо .agg(pl.count()), но реальная проблема заключается в том, что потоковая обработка наборов данных (которая необходима для объемов, превышающих объем памяти) во многих местах все еще находится в стадии эксперимента, поэтому она включена. Вы можете принять участие, передав streaming=True, чтобы получить:

base_lf.group_by(required_fields).len().collect(streaming=True)

API потоковой передачи отлично работал в моем сценарии. Большое спасибо. А ещё я поменял с "count" на "len", спасибо за совет!

João Luiz dos Reis Santos 12.06.2024 13:12

Другие вопросы по теме