• Python, postgress, pandas - куда утекает память?

    @Arlekcangp
    Разработчик, Лид, Архитектор ПО
    Я не специалист по пайтону, но присматриваюсь и ваш код меня заинтересовал. Немного погуглив я нашел такой похожий вопрос на SO ( https://stackoverflow.com/questions/39100971/how-d... ), но c более простым кодом:
    import pandas
    df = pandas.read_csv('large_txt_file.txt')
    del df

    Уже этого достаточно, что бы память не возвращалась в ОС. Автор вопроса подозревал Pandas, но как пояснили в ответах, это особенность самого пайтона:
    Reducing memory usage in Python is difficult, because Python does not actually release memory back to the operating system. If you delete objects, then the memory is available to new Python objects, but not free()'d back to the system (see this question).

    Т е если вы смотрите количество используемой процессом памяти, то оно будет только увеличиваться. Первое, что я бы попробовал, это поменять ваш код так:
    for station in config.STATIONS_LIST:
        sql_query = f"select * from table where  where station = '{station}'"
        df = pd.read_sql(sql_query, con=connection_pg)
        filename = f'data_{station}'
        filename_with_path = os.path.join(config.OUTPUT_PATH, filename)
        compression_options = dict(method='zip', archive_name=f'{filename}.csv')
        df.to_csv(f'{filename_with_path}.zip', compression=compression_options, index=False)
        <b>df = ' '</b>
        gc.collect()

    Т е не удалять переменную, а переприсвоить. Некоторые говорят, что это помогает (если честно, мне в такое с трудом верится, но я не знаю пайтона) Среди других рекомендаций: загружать данные меньшими порциями и офлоудить работу другому процессу, который затем убивается и память освобождается ОС. (на мой взгляд способ хороший, хоть и не слишком архитектурно-правильный, но гарантировано добавит стабильности и застрахует даже от будущих утечек, если они появятся либо в вашем коде либо в новых версиях библиотек)
    Другой вопрос, почему это увеличение не останавливается. Если это всё дело происходит на linux то я бы попробовал ограничить пайтону память (первое что нагуглилось: https://www.geeksforgeeks.org/python-how-to-put-li...) и посмотрел будет ли при этом интерпретатор умирать по причине недостатка памяти. Если будет, то на SO рекомендовали такое средство: https://mg.pov.lt/objgraph/ Этим можно посмотреть что именно потребляет память.
    Ответ написан
    5 комментариев
  • Как восстановить данные после вируса шифровальщика?

    CityCat4
    @CityCat4 Куратор тега Информационная безопасность
    //COPY01 EXEC PGM=IEBGENER
    Никак. Если есть контакты вымогателя - заплатить (да-да, проще всего заплатить!), иначе попытаться обратиться к Касперскому или другому антивируснику - может быть у них есть ключ или другой метод расшифровки. Способ этот абсолютно БЕЗ гарантий.
    Потому что расшифровать файлы - НЕВОЗМОЖНО.

    Все админы делятся на три категории - те, кто еще не делает бэкапы, те, кто их уже делает, и те, кто проверяет, как из них восстанавливаются данные.
    Ответ написан
    Комментировать
  • Лучший клиент git ( unity )?

    Почти все доступные gui-клиенты перечислены тут:
    https://git-scm.com/download/gui/windows
    Есть много бесплатных. А у платных есть как минимум триальный период, так что пробуй.

    А лучше/хуже - это дело вкуса.

    Любой конкретный ответ под таким вопросом будет просто навязыванием своего выбора.

    Но раз для юнити, то я бы посмотрел в сторону Fork, тк у него есть пара фич, которые пригодятся при разработке игр (например diff по картинкам)
    Ответ написан
    Комментировать
  • Лучший клиент git ( unity )?

    hottabxp
    @hottabxp
    Сначала мы жили бедно, а потом нас обокрали..
    Лучший клиент git
    Лучший клиент git - это консольный.

    Лучший клиент git - это дело вкуса каждого. Нравится вам TortoiseGit, так используйте его. Не нравится - ищите что-то лучшее.

    А что имеете в виду
    но есть что-нибудь лучше?
    Ответ написан
    Комментировать
  • Подключение к docker контейнеру Nginx по доменному имени?

    ddv88
    @ddv88
    Binance Futures
    Потому что нужен прокси. У тебя домен видит только контейнер.
    Либо воспользоваться Traefik, либо настроить прокси на хосте.
    Ответ написан
    Комментировать
  • Как корректно произвести множественное наследование в Python 3?

    ScriptKiddo
    @ScriptKiddo
    https://stackoverflow.com/a/58337004

    class A:
        def __init__(self):
            super().__init__()
            self.aa = 2
    
    
    class B:
        def __init__(self):
            super().__init__()
            self.ab = 3
    
    
    class C(A, B):
        pass
    
    
    c = C()
    print(c.aa, c.ab)
    Ответ написан
    1 комментарий
  • Я сделал Code Review, может быть я где-то ошибся или у вас есть что добавить?

    insighter
    @insighter
    -First time? - Huh? (C#, React, JS)
    Основная задача код-ревью дать обратную связь на выполненную работу, а не написать сочинение "по мотивам".
    Ваши комментарии это не код-ревью, особенно для уровня кандидата которого они ищут.

    PS Два момента непонятны.
    1.
    public extern int LongRunningCalculation(int value, int value2);

    Какая семантика у ключевого слова extern в этом случае, подскажет кто?

    2. На ревью дается то, что компилируется.
    public int GetValue(int index, int index2)

    При компиляции выдаст ошибку на строке return null;

    По коду - серьезная ошибка с блокировкой, пара не оптимальных моментов, ну и мелочевка с названиями и расположением в классе (статику лучше писать первой).

    PS Ах да судя по инициализации словаря, вообще непонятно зачем он используется, когда нужен двухмерный массив.
    Ответ написан
    4 комментария
  • Какая лучшая практика тестировать api?

    fox_12
    @fox_12 Куратор тега Python
    Расставляю биты, управляю заряженными частицами
    Мокапить запросы на внешние ресурсы
    Ответ написан
    Комментировать
  • Какая лучшая практика тестировать api?

    @Akela_wolf
    Extreme Programmer
    Этот - никак. Как минимум нужно избавиться от захардкоденого домена и вынести его в конфиг. Дальше возможны варианты:
    1. Wiremock - создает локальный сервер и отвечает на запросы к нему. То есть, "прикидывается" внешним сервисом для вашей программы.
    2. Юнит-тесты. Но для них нужно изолировать обращения к внешнему сервису и "закрыть" их интерфейсом, вместо которого будет подставляться тестовая реализация внешнего сервиса.
    Ответ написан
    Комментировать
  • Нужно ли проверять типы в Python?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Python
    Седой и строгий
    Для Python является идиоматичной обработка исключений вместо проверок допустимости действий.
    Ответ написан
    1 комментарий
  • Активность в приложениях?

    phaggi
    @phaggi
    лужу, паяю, ЭВМы починяю
    Обратиться на сервис freelance.habr.com и заказать там.
    Ответ написан
    Комментировать
  • Нужно ли проверять типы в Python?

    lxstvayne
    @lxstvayne
    Люблю Python
    Конечно, нужно, ведь мы ожидаем конкретные типы задавая параметры для функции. Можно проверять соответствие типам вручную, но есть альтернативный, более удобный и красивый, подход -- использование библиотеки pydantic, которая специализируется на валидации, а именно декоратор validate_arguments. Валидация помогает на ранних и даже на поздних этапах дебажить ошибки в логике вашего кода. Это очень помогает, даже если на проекте один человек.
    Ответ написан
    1 комментарий
  • Правильно ли я понял принцип инверсии зависимостей?

    @Akela_wolf
    Extreme Programmer
    Главная идея принципа инверсии зависимостей "детали зависят от абстракций, но не абстракции от деталей".
    В приведенном вами примере класс Main зависит от всего: от интерфейса INumberOperation и от обоих классов NumberOperation1, NumberOperation2. То есть тут принцип инверсии зависимостей вообще не работает. Никак.

    Проявляется же он в следующем примере. Пусть у меня есть некая абстрактная логика "прочитай число, выполни над ним операцию, запиши результат". Эта абстрактная логика (потому она и абстрактная) ничего не должна знать ни откуда она читает число, ни какую операцию над ним выполняет, ни куда и как записывает результат. Таким образом, у нас есть модуль, состоящий из
    interface NumberInput {
      int read();
    }
    interface NumberProcessor {
      int process(int a);
    }
    interface NumberOutput {
      void write(int a);
    }
    class Processor {
      private final NumberInput input;  
      private final NumberProcessor processor;
      private final NumberOutput output;
    
      public Processor(NumberInput input, NumberProcessor processor, NumberOutput output) {
        this.input = input;
        this.processor = processor;
        this.output = output;
      }
    
      void process() {
        output.write(processor.process(input.read()));
      }
    }

    Все. Модуль получился очень абстрактным и ни от кого никак не зависящим.
    Затем мы можем сделать реализации этих интерфейсов - они будут зависеть от нашего модуля логики (так как ссылаются на интерфейсы). И это полностью соответствует принципу инверсии зависимостей - детали зависят от абстракций.

    И наконец функция main, которая будет собирать все это в единое целое. Она самое конкретное что есть в нашей программе, так как она имеет дело с конкретными классами, экземпляры которых она создает. Поэтому она зависит от всех модулей - от модуля абстрактной логики и от модулей с реализациями интерфейсов. И тут принцип инверсии зависимостей тоже соблюдается - деталь (в какой именно конфигурации запускается программа) зависит от абстракции (абстрактная логики и конкретные реализации интерфейсов из которых выбирается именно та, которая будет использована)

    Этот принцип очень хорошо объяснен в книге Р.Мартина "Чистая архитектура", по крайней мере у меня все встало на свои места именно после прочтения этой книги.
    Ответ написан
    1 комментарий
  • Как мне передать информацию в другую функцию?

    @ultraevs
    Student
    Добрый вечер, передать вы ее сможете указав в аргументы нужной функции т.е def asktime1(message, text):
    Ответ написан
    Комментировать
  • Как происходит разрешения на папку в Linux?

    saboteur_kiev
    @saboteur_kiev Куратор тега Linux
    software engineer
    R на каталог - прочитать его содержимое
    W на каталог - редактировать каталог (добавлять, удалять файлы, переименовывать файлы)
    X - зайти в каталог

    Читай документацию
    Ответ написан
    Комментировать
  • Какие существуют книги / статьи для понимания темы "async" Python?

    @javedimka
    Хочу сока
    Статья вдохновившая Гвидо Ван Россума :
    https://www.cosc.canterbury.ac.nz/greg.ewing/pytho...

    Про асинхронностью есть в книге Лучано Рамальо "Python. К вершинам мастерства" Но существующее издание довольно старо, весной этого года ожидается обновлённая версия книги.
    Ответ написан
    1 комментарий
  • Какие существуют книги / статьи для понимания темы "async" Python?

    DollyPapper
    @DollyPapper
    Книг не знаю, есть лекции яндекса, Олег Молчанов, если хочется подробнее как это под капотом работает, то читать книгу по системному программированию Linux "Р.Лав Linux системное программирование". Собственно в лекциях расскажут про то, что асинхронность построена на не блокирующем API ввода вывода (системные вызовы select, pool, epool), а в этой книге можно подробнее узнать как эти системные вызовы работают.
    Ответ написан
    1 комментарий
  • Как получить цену из get запроса?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Python
    Седой и строгий
    Комментировать
  • Что такое "типы данных" в Python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Все типы данных - это классы, но не все классы - это типы данных. Хотя классы - это типы=) но не буду вас путать.
    "map, range, срез" - это не типы данных.
    Полагаю в том вашем вопросе од типами жанных имеют в виду простые типы вроде строк, чисел с плавающей точкой, целых чисел и даже комплЕксных.
    Кортежи (tuple) и словари (dict) - это уже структуры данных, коллекции... как угодно. Да, технически это тоже классы и в каком-то смысле их можно назвать типами, но все эти терминологические дебри вам ни к чему.
    Просто считайте типами данных атомарные значения простых типов. Если к вам докопаются при таком понимании, то надо таких слать=).
    Дальше интереснее. range, к примеру, это класс, инстанс которого "умеет" делать генератор арифметических последовательностей. Вот это вот слово "умеет" связано с питоновским понятием протоколов. К примеру, если к объекту можно обратиться по индексу, значит он поддерживает соответствующий протокол __getitem__. Если объект поддерживает срезы, то в этот метод можно подать специальный объект - инстанс slice. Этот инстанс просто несёт три параметра среза (начало, конец и шаг), а как его будет применять объект - это на откуп программисту.

    Вам, надо, наверно, еще понимать разницу между изменяемыми и неизменяемыми объектами, но... мне кажется вы решили избежать чтения учебников и планомерного изучения языка, а просто решили приёти сюда за персональным репетитором, который станет тут тратить своё время на объяснение тривиальных вещей из каждого первого учебника?

    Просто доверьтесь одному из учебников и не пытайтесь перепрыгнуть через голову.
    Ответ написан
    3 комментария