• Словарь или БД?

    @rPman
    Если данные обрабатываются отдельно, то самая быстрая реализация - записывать в файл в своем формате (даже если это будет построчно сериализованные json), обязательный flush после записи (кеш кстати можно отключить). Индекс строить в оперативной памяти в виде словаря (key->смещение в файле+размер или сами данные, если влезают). При перезапуске приложения после сбоя, файл перечитывается, индекс в памяти заполняется заново. Этот вариант подходит для случаев, когда параллельная аналитика уменьшает объем данных в этом файле, перенося их в базу данных (в этом случае нужно параллельно обновлять индекс в памяти основного приложения и при его перезапуске учитывать что именно читать из файла а что нет), один из способов реализации уменьшения размера файлов - хранить его кусками от времени, удаляя старые (при этом нужные данные повторно отправлять в систему, в общем дальше от задачи).

    Решение с таким лог-файлом (или несколькими, например по одному на процесс/поток/ноду, тогда не понадобится синхронизация записи) и индексом в оперативной памяти будет давать считанные миллисекунды на операцию (упираться все будет в iops диска), если совсем труба, исключай файловую систему и пиши прямо в блочное устройство (выгадаешь еще 3х-10х ускорения)

    Если хочется базу данных - бери что то типа mysql с отключенными транзакциями (myisam), и очень грамотно составленными индексами и партицированием (может даже самодельным). Большее количество задержек вносят именно индексы.

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

    p.s. когда то давно я писал что то подобное, диск был медленный hdd но так как с него не было чтений, только записи на случай сбоя, а все данные были в оперативной памяти, скорость была огромной, десяток тысяч операций на очень слабом тогда железе
    Ответ написан
    Комментировать
  • Словарь или БД?

    Vindicar
    @Vindicar
    RTFM!
    Есть целый ряд вопросов.
    1.
    Скрипт делает большое количество запросов к различным апи

    Что-то мне подсказывает, что затык скорее будет тут, а не на записи. Ты делал замеры производительности и убедился, что bottleneck именно на сохранении данных?
    2. И да, вопрос персистентности принципиален. Наскоько страшно потерять набранные данные?
    3. А у тебя в оперативку данные влезут? Ты же понимаешь, что по исчерпании оперативки система начнёт свопиться, и вся производительность пойдёт коту под хвост? Вообще, если данные влезают в оперативку, это не такой уж большой объём для ввода/вывода.

    Попробуй сначала сбрасывать в БД напрямую. Простое решение часто оказывается достаточным. Я очень подозреваю, что так и будет.

    Если скорости всё же будет не хватать - клади в очередь в ОЗУ, параллельно перекидывай в БД. Если у тебя io-bound задача, то лучше писать асинхронный код, и использовать асинхронную же обёртку вокруг БД. Тогда у тебя хотя бы очередь будет расти медленнее

    Если и это не поможет - посмотри, можно ли писать данные блоками фиксированного размера в какой-нибудь бинарный файл. Если там будет минимум преобразований типов (например, число-строка), скорость должна быть приемлемая. Этот файл может читать отдельный процесс, и уже преобразовывать и сохранять в приемлемом виде. Но я бы не советовал так извращаться.
    Ответ написан
    2 комментария
  • Почему при асинхронных запросах к апи не возвращает значения?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Python
    Седой и строгий
    Потому что вызов асинхронной функции возвращает сопрограмму, а не результат выполнения.
    Ответ написан
    4 комментария
  • Как отказаться от велосипеда?

    @Jack444
    Не понятно что делают у тебя все эти функции, но код можно сократить так.

    def main(token):
        result = []
        funcs = (binance, bybit, huobi, mexc, kucoin, gate)
        for func in funcs:
            if call := func(token):
                result.append(call)
        result = '\n'.join(result)
        print(result)
    Ответ написан
    Комментировать
  • Как работать с конструкцией try except?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Сделайте ещё один вложенный цикл для попыток обработки каждого из элементов. Можно при успешном выполнении без ошибок выходить из внутреннего цикла досрочно, а при ошибке не выходить досрочно и цикл будет повторять попытки.
    Если бы у вас было побольше опыта программирования на питоне, я бы посоветовал бы вам вынести обработку одного элемента в отдельную функцию, а еще посоветовал бы поупражняться в написании декоратора `retry`, который будет оборачивать любую функцию в новую функцию и в случае ошибки повторять её запуск пока не будет исчерпан лимит попыток.
    По-моему такой пример или упражнение, кстати, и было в одной из книг Лутца. Но вам подойдёт практически любая, где рассматриваются основы языка.
    Ответ написан
    2 комментария
  • Telethon (TelegramClient) - как подставить значение переменной в (Please enter your phone (or bot token): )?

    @AlbertForest
    Если проблема с "Please enter your phone (or bot token): " в случае блокировки аккауна, можешь сделать await client.start('0')
    Но это сработает если есть файл активной сессии или StringSession
    В остальных случаях просто передавай номер телефона

    client = TelegramClient(phone=xxxxxxxxxx)

    Для получения кода можно передать функцию, которая его вернет

    def code_callback():
        while True:
            #ждем код
            return code
    
    await client.start(phone=phone,  code_callback=code_callback)
    Ответ написан
    Комментировать
  • Как создать свой личный автопостинт в телеграме?

    phaggi
    @phaggi
    лужу, паяю, ЭВМы починяю
    Как создать свой личный автопостинт в телеграме?

    1648368759_29-kartinkof-club-p-mem-khochesh-stat-programmistom-32.jpg
    Ответ написан
    Комментировать
  • Как определить размер объекта на фото при помощи python?

    Vindicar
    @Vindicar
    RTFM!
    Смотри в сторону OpenCV. Какой конкретно метод - зависит от искомого объекта: один ли он в кадре, насколько он контрастен по отношению к фону, насколько много на нём контрастных деталей, и т.д.
    Есть template matching для случаев, когда видимый размер и ориентация известны. Работает для нескольких объектов.
    Есть feature matching, для случаев, когда объект только один и имеет контрастные, узнаваемые элементы, но может быть разного размера и ориентации.
    Есть каскады Хаара (или тут) для поиска множества объектов известной ориентации, но с варьируемым размером.
    Есть backprojection, если объектов несколько, но они имеют характерный, узнаваемый набор цветов.
    Копай, разбирайся, выбирай.

    Если же вопрос в том, чтобы определить масштаб снимка, то тут самый простой способ - использовать шахматный шаблон с заранее известным размером ячейки и числом строк/столбцов. Тогда можно будет оценить расстояние между углами шаблона в пикселах, и сопоставить его с размером объекта в том же кадре. Заодно можно будет попробовать исправить перспективные искажения (попробовать переделать снимок в "вид строго сверху").
    Ответ написан
    5 комментариев
  • Как исправить проблему с кодировкой (UnicodeEncodeError: 'latin-1' codec can't encode characters..) при взаимодействии с mysql?

    nixbox
    @nixbox Автор вопроса
    Итак, проблема была не в БД и Python,
    a в языке системы (VPS/Ubuntu 18)
    в которой русского языка не было установлено вообще.

    Проверьте кодировку системы:

    import sys
    import locale
    
    print(sys.getfilesystemencoding())
    print(locale.getpreferredencoding())


    У меня на VPS как раз стояла ISO 8859-1 ( Latin-1 )

    Решение - добавить в систему RU локаль.
    Ответ написан
    Комментировать