Профиль пользователя заблокирован сроком с 12 апреля 2022 г. и навсегда по причине: спам
  • Если jit так хорош, то зачем вообще нужна интерпретация?

    @deliro
    1. JIT сложно и долго писать
    2. JIT не только ускоряет выполнение, но и замедляет (потому что нужно тратить время на анализ, компиляцию, деоптимизацию и т.п.). Далеко не всегда (RoR тому пример и почти любые скрипты, которые выполняются один раз и умирают) JIT позитивно влияет на время исполнения
    3. JIT дороже по памяти
    Ответ написан
    Комментировать
  • 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 комментариев
  • Как защититься от двойного списания в многопоточном приложении?

    если проверка прошла, то обе выполнятся

    Кто сказал что СУБД позволит выполнить обе транзакции с одними и теми же исходными данными?
    Если обе транзакции начали исполняться параллельно, прочитали одни и те же данные, и пытаются их перезаписать, как СУБД будет себя вести? Позволит ли она вообще отработать обеим транзакциям? Или одна их них подождёт, пока не закончит работу другая? Вопрос гораздо интереснее, чем кажется. И, что самое главное, неглупые люди уже подумали над ним. Очень хорошо подумали.

    В доках постгреса написано ещё лучше.

    Или лучше каждый раз пересчитыапть из истории?

    Запаритесь пересчитывать, это не масштабируется, сложность расчёта будет всё время расти. Если считаете, что можете накосячить с текущим балансом - сделайте возможность его пересчёта согласно истории пополнений/трат. Это называется денормализованными данными. Это один из тех случаев, когда оправдано применение хранимых процедур для актуализации таких данных. Т.е. вместо непосредственной записи одновременно и в историю пополнений/трат и в актуальный баланс прямо из приложения, вы вместо этого вызываете хранимую процедуру, которая атомарно как пишет новую операцию - это ваши основные данные - так и меняет нужным образом ваши денормализованные данные - т.е. ваш баланс. Заодно в этой же хранимке можно дополнительно проверить возможность списания. Это решение не очень хорошо масштабируется, и вообще хранимки это антипаттерн для современных модных-молодёжных распределённых приложений, но судя по вашим вопросам врядли вы отвечаете за разработку сервиса, где таких списаний десятки тысяч в секунду, так что вам хватит.

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

    @rPman
    Блокировку во время траты уже сказали, но бывает что процесс может длиться достаточно долго, чтобы пользователь в соседнем окошке не смог совершить параллельно оплату (у него будет все висеть), поэтому блокировки реализуют программно

    Добавь к аккаунту пользователя поле lockedBalance, в начале транзакции покупки добавляй к этому значению нужную сумму для траты (а по окончанию эту же вычитай как от сюда так и из общего баланса), соответственно итоговый баланс при проверке считай из разницы основного баланса и этого блокированного. Если транзакция сфейлится, это придется отслеживать, заблокированный баланс так же уменьшай на сумму сделки но не трогай общий.

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

    Stalker_RED
    @Stalker_RED
    ffa11c5561b6ca472680216ac54dbccb.jpg

    Начните лучше с какого-нибудь дружелюбного языка, вроде паскаля или пайтона (только не с js, с него потом сложно переучиваться). И только после того как напишете десяток hello world, калькуляторов, астрологических календарей или тудушек - переключайтесь на плюсы. Плюсы вообще клевые, много узнаете о внутрянке, но начинасть с них тяжело.
    Ответ написан
    1 комментарий
  • Какой Office лучше использовать в качестве замены MS Office?

    fdroid
    @fdroid
    press any key
    Ответ написан
    Комментировать
  • Какой выбрать дистрибутив Linux для начинающего разработчика?

    @AVKor
    Для любых целей: Debian.

    Никаких проблем с ПО для разработки не будет.
    Ответ написан
  • Почему ec2 не может увидеть RDS?

    inoise
    @inoise Куратор тега Amazon Web Services
    Solution Architect, AWS Certified, Serverless
    Ещё один замечательный человек забыл разрешить ICMP трафик)
    Ответ написан
    6 комментариев
  • AWS AMI Centos 7/8 платный или бесплатный на EC2?

    inoise
    @inoise Куратор тега Amazon Web Services
    Solution Architect, AWS Certified, Serverless
    Расписан же прайсинг как для детей. Оплата идёт за ec2 на котором оно крутиться будет
    Ответ написан
    2 комментария
  • Что делать если не запускается sublime text?

    metallix
    @metallix
    Backend - developer
    Комментировать
  • Random как сгенерировать случайные числа но с определенной вероятностью выпадения?

    @dmshar
    Эта элементарная задача называется "генерирование дискретных случайных величин с заданным законом распределения". Решается классическим образом.
    Сначала разбиваем наш диапазон от 1 до 100 на следующие интервалы:
    1-35,36-60,61-85,86-95,96-100.
    Затем генерируем число, равномерно распределенное в диапазоне от 1 до 100. Номер интервала, в который это число попадает дает ваши генерируемые цифры - от 1 до 5, причем распределены они в точности по вашей таблице распределения.
    Ответ написан
    11 комментариев
  • Не тривиальный пример библиотеки Logger в python?

    @deliro
    Несколько лет назад я (видимо, как и ты) уверовал в logging. Ведь не зря же там такие дикие и глубокие настройки: и форматтеры есть, и хэндлеры есть, да и фильтры какие-то. И подумал я: крутые программисты всё это используют, а я на задворках рынка побираюсь.

    И начал с тех пор настраивать все мыслимые и немыслимые настройки logging. Все ошибки у меня были в соответствующих файлах для ошибок. Также, был лог с дебаговой инфой. Всё это группировалось по файлам. Дебаг форматировался одним форматтером, ошибочный лог — другим форматтером, более подробным. И всё это росло, цвело и пахло.

    Реальность оказалась жестокой. Все эти форматтеры оказались абузой — грепать логи стало сложней. Отдельные файлы с дебагом и ошибками оказались абузой — ведь проще грепнуть по уровню лога ( | grep ERROR). В куче файлов логов — чёрт ногу сломит. Да и вообще, логи почти всегда оказывались ненужными — ошибки летят в Sentry, а статистика собирается другими механизмами (prometheus). А ротацию и архивирование логов сделали девопсы.

    А вот хорошие практики, которые я вынес:
    1. Возьми loguru, которому буквально не нужны настройки:

    from loguru import logger
    ...
    # Где-то настроил sink-файл (либо будет только stdout)
    ...
    logger.debug("hello")


    2. Иногда удобно логи вести в JSON-формате. Отпадает необходимость придумывать хитрые grep'ы, всё отлично фильтруется с помощью jq

    3. Ошибки надо не логировать, а слать в Sentry. Желательно, если Sentry настроен на веб-хуки в какой-нибудь slack/discord, чтобы ты видел ошибку в ту же секунду, как она произошла. В Sentry должен быть порядок.

    4. Статистику по логам не стоит строить. Для этого есть куда более удобные и быстрые инструменты от обычных баз данных до prometheus + grafana

    5. Куча файлов логов — в топку. Один файл

    6. Ротация логов желательно должна быть извне

    7. Используй ELK

    8. Используй тесты и дебаггер

    Если резюмировать: на логи возлагают слишком большие надежды и ожидания. Логи — это побочный продукт, который ОЧЕНЬ РЕДКО помогает расследовать неожиданное поведение, причём, очень неудобным способом. Чаще всего, логами обкладывается недостаточно нужной информации и много ненужной информации. И в момент аварии логов не хватает, на то ведь она и авария — её нельзя предусмотреть. Вместо логгирования в большинстве случаев удобнее использовать другие инструменты. Также, советую ознакомиться с этим https://sobolevn.me/2020/03/do-not-log
    Ответ написан
    1 комментарий
  • Mac OS X или linux?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Линукс тормознутей, да и мак тормознутей на хакинтошах, в общем ставьте windows и не придумывайте
    Ответ написан
    22 комментария
  • Почему невозможно изменить ulimit -n в WSL Ubuntu 20.04.1?

    @q2digger
    никого не трогаю, починяю примус
    есть схожая проблема в Майкрософтовском гите https://github.com/Microsoft/WSL/issues/1688
    там внизу есть есть способы решить эту проблему. Посмотрите, может вам чтото подойдет из них
    Ответ написан
    1 комментарий
  • Как переписать for на map для асинхронного кода?

    Kozack
    @Kozack Куратор тега JavaScript
    Thinking about a11y
    await Promise.all(list.map(funcOne)); // Если в случае ошибки в одной итерации нужно остановить все остальное
    
    await Promise.allSettled(list.map(funcOne)); // Если в случае ошибки в одной итерации остальные должны продолжить работу


    Но вы должны учитывать разницу:
    • Если использовать стандартный for то все асинхронные вызовы будут выполняться последовательно, один за другим.
    • Если вызывать асинхронную функцию в map, то все вызовы будут запущены параллельно, и итоговый Promise.all нужен, чтобы дождаться пока они все будут выполнены. Это эквивалентно примерно такому коду:
      const promises = []
      for (const item of list) {
            promises.push(funcOne(item));
      }
      await Promise.all(promises)

    Ответ написан
    5 комментариев
  • Правильно ли я меняю user-agent?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    Правильно
    Ответ написан
    Комментировать
  • Как это называется?

    saboteur_kiev
    @saboteur_kiev Куратор тега IT-образование
    software engineer
    В университете дают БАЗОВЫЕ навыки программирования.
    Специализация на back-end, front-end и другие начинается гораздо, гораздо позже.

    В любом случае профессиональные навыки программирования дают не в университете. Их ты будешь получать самостоятельно.
    Ответ написан
  • Как локально выполнить python скрипт c веб страницы?

    @necrodeflorator
    RabbitMQ
    Ответ написан
    Комментировать
  • Как начать работать в сфере андроид разработки?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Java
    Седой и строгий
    На фрилансе нет шансов, пока не дорос в офисе хотя бы до мидла. Пытайтесь устроиться.
    Ответ написан
    2 комментария
  • Как правильно работать с фрилансером?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Если даешь доступ только к одной определенной папке, где нужно только там работать, фрилансеры просят доступ ко всему исходнику, тоже самое если ты отправляешь один файл ему, в котором нужно сделать правки.

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

    Боитесь слива, наймите в штат разработчиков и взращивайте в них высокий уровень лояльности.
    Ответ написан
    5 комментариев