169 похожих чатов

Всем привет, давно не виделись! С разрешения Ильи я пришел к

вам с питоном и его pandas :)

Сразу скажу, что я не профессионал ни в R, ни в питоне, тем не менее я пишу рабочие .py и .R скрипты уже больше двух лет. Поэтому буду очень рад конструктивной обратной связи.

Ситуация. Работаю с API Авито, получаю статистику сразу от нескольких клиентов, собираю в 1 таблицу, чтобы хранить в таком виде в БД - это удобно, потому что список клиентов каждый раз меняется. Изначально при парсинге данные с API собираются в один большой JSON {клиент: статистика}, откуда уже удобно для меня превращается в таблицу итоговой статистики сразу по нескольким клиентам.

Данный код отрабатывает за 43 сек и потребляет в пике 1765 MB ОЗУ. JSON и свой код питона прикладываю.

Нюанс 1. Я знаю что такое асинхронность и многопоточность в питоне, но прежде чем распараллеривать процессы - я бы хотел их для начала оптимизировать, поэтому в примере работа кода последовательна.

Нюанс 2. Я пробовал генераторы обернуть в pd.Series, получалось снизить ОЗУ на 200-250 MB, но процесс растягивался по времени почти в 2 раза - с 43 сек до 81 сек.

Почему я вообще взялся решать вопрос потребления ОЗУ? Потому что из-за того, что на Ubuntu процесс жадно потребляет ОЗУ - система просто убивает процесс как опасный для системы. Как временное решение - я с запасом выкрутил параметры сервера с 1 гига ОЗУ до 4. Теперь ничего не падает, но вопрос не даёт покоя)

Я переписывал на R данный блок, что удивительно - он отрабатывал практически без потребления ОЗУ и на 20 с быстрее. Но только из-за этого момента я бы не хотел все действующие скрипты переписывать на R. Поэтому прошу совета по работе с pandas у знатоков с опытом :)

Заранее всех участников благодарю.

24 ответов

112 просмотров

А вы уверены, что хотите хранить несколько клиентов в одном json? Вы же даже в коде все операции выполняете на уровне клиента. Если у вас каждый клиент представлен списком словарей, то логично использовать pd.DataFrame.from_records(dict_list) Это должно быть быстрее прохода по циклу и меньше по памяти

есть какая-то причина почему это нужно держать именно в формате словаря? а не csv например? мне кажется, что если сможете избежать использования циклов, то существенно сократите потребление ОЗУ и повысите скорость скрипта

Чуть поправлю. Я всего-лишь пригласил. Многие же не пугаются питон кода и могут подсказать. Можно и альтернативу на R дать.

Саша | IT- Автор вопроса

Стикер

Я сейчас не вижу какой-то причины, почему сбор информации по клиенту не может быть отдельным процессом/вызовом функции, вы же не высчитываете, какие-то метрики для которых вам нужны все записи, вы просто поочередно проходитесь по каждому клиенту, они друг от друга никак не зависят. Может быть проще сделать сбор данных по каждому клиенту отдельным процессом, выносить это в отдельную таблицу, а уже потом собирать результаты воедино? Логично, что у вас потребление памяти высокое - словарь не очень оптимальный способ хранить данные

Саша | IT- Автор вопроса
Makar Minchenko
Я сейчас не вижу какой-то причины, почему сбор инф...

Я думаю основная проблема именно в сборе информации. Сам по себе скрипт практически не использует память ровно до момента сбора воедино. Именно процесс сбора воедино занимает пиковую нагрузку.

Саша | IT
Я думаю основная проблема именно в сборе информаци...

тогда поиграйтесь с типами данных - условно, можно привести строковые колонки к категориям, заменить float на int, тогда снизится потребление памяти при конкатенации датафреймов вот здесь разбирают конкретные примеры но в любом случае это pandas, он очень сильно ест память, к сожалению

я все задачи перекладывания джесонов возложил на это: https://airbyte.com/ Есть как клауд (платный), так и open source. В источниках нет апи авито, но в моём кейсе также нет кучи источников из коробки, зато есть connector builder и там за час-другой (в зависимости от опыта, я коннектор на простом апи создаю менее чем за час) можно с нуля создать любой коннектор к апи, который возвращает джейсоны. Советую

Дмитрий Володин
я все задачи перекладывания джесонов возложил на э...

Airbyte в моём случае (перекладывание данных из mysql в postgresql) оказался тяжеловесным медленным куском копролита. Решили в итоге задачу одним коротким оператором в airflow

Mikhail
Airbyte в моём случае (перекладывание данных из my...

ну так я и говорил про перекладывания из апи в хранилище, а не из базы в базу)

Это туда входит. Перекладывание джейсонов - общий неформальный термин.

Если мне надо читать данные из апи, складировать их в хранилище и попутно преобразовывать (не супер сложно, но то же объединение, удаление лишних полей). Например Интерком в кликхаус или тикток в бигквери. Ваша задача похожа на довольно простую в плане логики: забери из апи, немного преобразуй и положи в базу. Это именно то, что и делает эйрбайт.

по примеру непонятно зачем словарь. словарь — вещь тормозная + накладные на менеджмент памяти. Все складывается в прямоугольную таблицу. Ну и про pandas лучше забыть в таких задачах. polars спасет. + если беспокоит память и нужно ускорить то лучше делать в многопоток , каждый поток сбрасывает в файлы на диск, а потом одним махом все с диска считать и собрать. не будет оверхеда на передачу данных между потоками. можно и в баше собрать если csv

Саша | IT- Автор вопроса
Ilya Shutov
по примеру непонятно зачем словарь. словарь — вещь...

Словарь типа "клиент: все его данные ', там токены, id, балансы всякие. Просто складировать удобно.

Саша | IT
Словарь типа "клиент: все его данные ', там токены...

в плоской таблице кратно удобнее и быстрее

Саша | IT- Автор вопроса
Саша | IT
Словарь типа "клиент: все его данные ', там токены...

Словарь много хуже прямоугольной таблицы поскольку в нем энтропия больше. В таблице известен размер, а также типы колонок. В словаре — неизвестно ничего, можно встретить любого зверя. Больше хаоса — больше времени и доп. информации, чтобы держать это под контролем.

Еще упоминал типовые схемы здесь и здесь

Саша | IT- Автор вопроса
Ilya Shutov
Еще упоминал типовые схемы здесь и здесь

Меня всегда интересовал вопрос, как вы всё помните где и о чем писали? У вас какая-то таблица с тегами?)

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Ребят в СИ можно реализовать ООП?
Николай
33
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Карта сайта