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 ответов

43 просмотра

А вы уверены, что хотите хранить несколько клиентов в одном 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
Еще упоминал типовые схемы здесь и здесь

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

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

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

а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Добрый день. Хочу сделать отрисовку по команде на панели. Почему-то рисуется только при втором вызове. С чем может быть связано, не подскажете? procedure TForm1.FormDblClick(...
Kirill Filippenok
20
I just installed it but how do I use it?
Talula
12
Всем доброго дня! Подскажите может кто использовал связку Pagebuilder + Clientsetting. Сами параметры с типом pagebuilder в модуле Clientsetting работают нормально, можно такж...
Александр Добриков
12
Всем привет! Нужен совет от опытных. Переношу свой проект с Делфи 10.2 Токио на Лазарус 3.2 установленный через инсталлятор fpcupdeluxe-x86_64-win64. При импортировании проект...
Дмитрий Завгородний
7
А почему в си некоторые вещи работают с двойными кавычками некоторые с одинарными? Нельзя было все сделать с одними или чтоб работало с разными? например чтоб выводить строки ...
.
15
Всем привет! Подскажите. Я написал приложение на Delphi 10.2 Tokyo под Windows 10. И передо мной стал вопрос о том чтобы сделать это приложение кроссплатформенным (под Linux и...
Дмитрий Завгородний
24
Эх кто-то пришел и весь праздник испортил :( You need complex FBX scene importing setup to change things on import? good luck with that. You need navigation and pathfinding? g...
Serg Gini
5
Good afternoon, I just started learning php in conjunction with mysql. I am registering a system on a local Mamp server using phpMyAdmin. It seems to be stored normally in the...
ManGo
1
я не про это. какая еще есть инфа, или может появиться, что ее можно обозначить названием данной игры? зачем плодить хештеги, которые обозначают одну сущность? в данном случ...
Aiwan \ (•◡•) / _bot
5
Карта сайта