• Как хранить информацию о пользователях телеграмм бота?

    a777mp198
    @a777mp198
    Python developer
    PostgreSQL отличная база данных, сколько использую её для работы с телеграм-ботами - проблем не возникает.
    Ответ написан
    Комментировать
  • Как хранить информацию о пользователях телеграмм бота?

    sqlite3 вполне годится. для предварительного хранения информации, если она получается по шагам, можно использовать redis. Только тогда, когда вся информация собрана и провалидирована, только тогда делается запись в БД
    если бот сильно загружен запросами и его нужно ускорить, то нужно асинхронного бота и для sqlite использовать модуль aiosqlite https://pypi.org/project/aiosqlite/
    Ответ написан
    Комментировать
  • Как реализовать параллельные вычисления в Pandas с разными DF без последующего сведения?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Поскольку на вопрос никто не писал ответа - я напишу вариант.

    Это не совсем ответ. Это скорее список сомнений.

    Дело в том что BigData в принципе не работает онлайн. Тоесть нельзя запускать анализ в ответ на мышко-клик пользователя и ожидать что это будет меньше 2.5 секунд. Таких задач никто не ставит. Если хотят чтоб пользователь что-то быстро получал - то готовят DataMart, OLAP-cube, или некий Gold (золотой) уровень материализовнных таблиц в парадигме lakehouse. Тоесть грубо говоря готовят данные к выдаче. Что только взять по ключу и показать. И на этом уровне обычно не ставят parquet а берут CosmosDb+Redis (key-value) чтоб браузер не ждал долго. Никаких агрегаций здесь быть не должно.

    Как подготавливать эти уровни серебрянного или золотого представления данных - это отдельная задача. Есть микро-батчи или стриминг но в общем и целом нельзя делать в ответ на действие пользователя. Это делает pipeliene.

    Второе. Как уже верно было подмечено "Сервер 4 ядра, 16 гб оперативки" - это не конфигурация для Spark. Это просто какой-то сервак. Spark - это кластерная система и он имеет преимущества при работе в "импульсном
    режиме в кластере" но ей нужен пул рабочих машин (хотя-бы штук 4-8) и файловая система наподобие hdfs или ее более современные вариации (s3/msBlobStorage). Это очень важно. Иначе не будет скейлится I/O.

    Третье. Паркет (parquet) вообще имеет сильные преимущества когда вы выбираете 45 столбцов из 4500. В этом случае дисковая оптимизация сработает лучше чем у реляционных систем и выберет ровно столько IOPS сколько надо для публикации именно 45 столбцов. В остальных случаях паркет только фейлит и лучше вам брать AVRO например или реляционные БД.

    Четвертое. Партишенинг. Очень часто бизнес запрашивает данные которые физически можно консолидировать по партишенам. Тоесть если ваш parquet-файл разрезать на периоды и допустим продукты то мы получим следующую физическую структуру файлов:
    sales/year=2022/product=001/part-00000-a11a0ce2-ea20-4897-a713-130a6538cd9a-c000.snappy.parquet
    sales/year=2022/product=002/part-00000-a11a0ce2-ea20-4897-a713-130a6538cd9a-c000.snappy.parquet
    ...
    sales/year=2023/product=500/part-00000-a11a0ce2-ea20-4897-a713-130a6538cd9a-c000.snappy.parquet

    Эту структуру я придумал с головы. Но у вас есть много вариантов как комбинировать продукты-менеджеры-заказчики-отчетные-периоды.

    И есть предположение что в таком случае операции агрегации пройдут быстрее за счет естесвтенного физического партишеннга. (Это я говорю для Spark. Для его оптимизатора. Как будет в Panadas я не знаю.)
    С точки зрения Spark - структура файлов в таком формате рассматривается как партицированная табличка в оракле. При этом надо конечно помнить основные правила HDFS и биг-дата. Никаких мелких файлов! Вы должны расчитывать в 128Мб как в самую мелкую единицу I/O.

    Пятое. Я это не использовал. Но посмотрите в направление библиотеки Apache Arrow. Она имеет сильные оптимизации для векторной алгебры и знает в лицо parquet. Если вы все-таки хотите оставаться в той парадигме выдачи запросов Python/Django/Pandas - то исследуйте как arrow может ускорить ваши операции агрегаций. Только вам возможно придется отказаться от Pandas-DataFrame API а использовать что-то низкоуровневое типа С++ для векторизовнного API.

    Как видите - векторов развитя много. Думайте.

    UPD:
    Ответ написан
    Комментировать
  • Как отправлять обмены в стиме через steampy?

    Vindicar
    @Vindicar
    RTFM!
    1. Почитать документацию.
    2. Найти метод с говорящим названием make_offer().
    3. Посмотреть пример, понять его, проверить в деле.
    4. Адаптировать пример для своих нужд.
    Ответ написан
    2 комментария
  • Почему не получается преодолеть барьер в изучении программирования?

    @Tsuyoshi_V
    От себя бы посоветовал ресурс METANIT, полное руководство по языку с#. Очень доходчивый для новичка ресурс по изучению языка.
    UPD: Все бесплатно и ёмко
    Ответ написан
    Комментировать
  • Нормально ли создавать множество очередей на один и тот же ивент?

    @yarkin
    Да, нормально, очередь запускается для потребителя (пула потребителей). Для публикующей стороны создаются обменники.
    Ответ написан
    Комментировать
  • Как вывести фото на экран?

    Vindicar
    @Vindicar
    RTFM!
    Заголовок Content-Type попробуй прописать, в конструкторе Response. Без него сервер не знает, что ты отдаёшь, и отдаёт контент как application/octet-stream, т.е. какой-то произвольный бинарный блоб. А такие вещи браузер может только сохранить.
    Тебе нужно знать формат твоего файла, и отдать правильный content type, например, image/jpeg.
    Ответ написан
    1 комментарий
  • Как расчитать кол-во вариантов при рандомизации текста?

    Vindicar
    @Vindicar
    RTFM!
    Обозначим одну подстановку как "терм", и допустим, что все варианты в терме уникальны (т.е. нет повторений внутри одного терма).
    Для терма {} количество комбинаций равно количеству вариантов в терме.
    Для терма [] количество комбинаций равно количеству перестановок вариантов в терме, т.е. факториал от количества комбинаций.
    Для всего выражения количество комбинаций должно быть равно произведению количеств комбинаций для каждого терма.

    С вложенными вариантами чуть сложнее.
    Для {} количество вариантов это по сути сумма их весов.
    Для [] количество вариантов считается так: количество перестановок вариантов, умноженное на произведение весов вариантов.
    У простой строки вес 1, у вложенного терма вес равен количеству его комбинаций.
    Таким образом, можно посчитать число комбинаций рекурсивно.

    import math
    
    class RandomChoice(list):
        pass
    
    class RandomOrder(list):
        pass
    
    def random_choice(options) -> int:
        total = 0
        for option in options:
            if isinstance(option, RandomChoice):  # вложенный выбор варианта
                total += random_choice(option)
            elif isinstance(option, RandomOrder):  # вложенное переупорядочивание
                total += random_order(option)
            else:
                total += 1
        return total
    
    def random_order(options) -> int:
        total = math.factorial(len(options))
        for option in options:
            if isinstance(option, RandomChoice):  # вложенный выбор варианта
                total *= random_choice(option)
            elif isinstance(option, RandomOrder):  # вложенное переупорядочивание
                total *= random_order(option)
            # а для просто варианта ничего делать не надо
        return total
    
    def total_count(items) -> int:
        total = 1
        for item in items:
            if isinstance(item, RandomChoice):  # вложенный выбор варианта
                total *= random_choice(item)
            elif isinstance(item, RandomOrder):  # вложенное переупорядочивание
                total *= random_order(item)
        return total
    
    sample = [
        'я', 
        RandomChoice(['купил', 'приобрел']), # 2
        RandomChoice(['на ярмарке','на рынке','в магазе']), # 3
        RandomChoice(['сыр', #8
            RandomOrder(['соль, ','хлеб, ','муку, ']), # 6
            'сахар']),
    ]
    
    
    combos = total_count(sample)
    print(combos)
    Ответ написан
    3 комментария
  • Как сделать что бы скрипт когда сделал определенную задачу останавливался на 10 секунд?

    @samanwirst
    Вроде бы человек
    Если вам нужно заморозить весь код, то используйте:
    import time
    
    time.sleep(10)
    #код действий после ожидания 10 секунд


    Но если у вас асинхронная функция или нужно чтоб код не останавливался, тогда используйте:
    import asyncio
    
    async def func_name():
        await asyncio.sleep(10)
        #код действий после ожидания 10 секунд
    Ответ написан
    Комментировать
  • Как ускорить циклы while?

    Не используйте мультипроцессинг или мультипоточность. Пока, по крайней мере.
    Разбирайтесь с алгоритмами - например проходить попиксельно всю игровую область - это всегда будет медленно.
    Найдите и почитайте какую нибудь книжку по разработке игр, там наверняка будет что нибудь на тему оптимизации.
    Ответ написан
    1 комментарий
  • Как из суммы md5 получить содержимое обратно?

    orlov0562
    @orlov0562
    I'm cool!
    Посчитай самостоятельно хеш всех цифр от 1 до 100.000.000 и сохрани в быстрое хранилище или вообще в память, если ее достаточно и используй поиск по нему вместо сторонних сервисов.
    Ответ написан
    Комментировать
  • Существует ли программа для расчётов формул с переменными?

    dimonchik2013
    @dimonchik2013
    non progredi est regredi
    ничего не понял

    mathcad, maple, matlab не существуют уже ?
    Ответ написан
    1 комментарий
  • Нужен ли Python-программист в России?

    samodum
    @samodum
    Какой вопрос - такой и ответ
    Python - востребованный в настоящее время язык во всём мире и перспективный - есть задел на будущее.
    Поэтому не должно быть проблем с поиском работы на удалёнке.
    Чего только стоит машинное обучение, которое в основном и имеет реализации на python.
    Во фразе "учить 1с или Php или вообще податься в web" чувствуется боль и отчаяние человека, который вот-вот упадёт на дно.
    Я, когда отдыхал на Ибице, познакомился со шкипером-математиком, который ходил на яхте по морям и окиянам и при этом кодил на Питоне прямо там, на яхте. А потом девчонкам показывал графики в виде фаллосов-ромашек... Романтика + технологии = крутотень нереальная
    Ответ написан
    6 комментариев
  • Как открутить сорванный болтик находящийся рядом с жёстким диском?

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

    Xaip
    @Xaip
    Видно что слизалась резьба, у меня есть два решение этой проблемы:
    Приложите ненужную отвертку к винту и капните НЕМНОГО клея. Подождите затвердения и выкрутите. Второй вариант более гуманный но более сложный. Попробуйте припаяться к винтику с помощью олова и кислоты. Таким образом вы сможете нанести новую резьбу и использовать винт в дальнейшем
    Ответ написан
    Комментировать
  • Как открутить сорванный болтик находящийся рядом с жёстким диском?

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

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

    15432
    @15432
    Системный программист ^_^
    Ухватить тонкими плоскогубцами и выкрутить.
    Ответ написан
    Комментировать
  • Как открутить сорванный болтик находящийся рядом с жёстким диском?

    @solalex
    1. Приложить резинку, а сверху крестовую отвертку и надавив выкрутить.
    2. Пропилить тонким надфилем борозду под плоскую отвертку.
    3. Высверлить болт мелким сверлом.
    4. Сточить головку болта полностью надфилем.
    Ответ написан
    Комментировать