Форум программистов, компьютерный форум, киберфорум
Python: Flask
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 18.01.2015
Сообщений: 88

Утечка памяти во Flask

18.07.2022, 13:52. Показов 1848. Ответов 7

Студворк — интернет-сервис помощи студентам
Всем доброго дня!

Существует несколько терминалов с видеокамерами, которые раз в 60 секунд отправляют на сервер (/get-info) последний фрейм и свое имя (для фильтрации в БД), в ответ он получает команды. Я записываю это в БД, однако когда на web-страницы сервера я перехожу в состояние "активации" то терминал будет передавать информацию каждые 6 секунд. В рандомный момент времени сервер вылетает с ошибкой Ошибка сегментирования (стек памяти сброшен на диск)

я добавил gc.collect() он стал работать более стабильней, однако все равно вылетает. Может кто подсказать как еще снизить потребление?

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
@app.route('/terminals/get-info', methods=['GET', 'POST'])
@profile
def get_infoTerminal():
    gc.collect()
    if request.method == 'POST':
        content = request.json
        terminal = session_db.query(Terminal).filter_by(title=content['name']).one_or_none()
        if terminal:
            if terminal.active == True: #if terminal is checked
                terminal.lastframe = content['lastframe']
                terminal.last_time = datetime.now()
                session_db.add(terminal)
                session_db.commit()
                t_dict = {
                'time_connect': 6,
                'commands' : terminal.commands
                }
            else: #all termianal
                terminal.lastframe = content['lastframe']
                terminal.last_time = datetime.now()
                session_db.add(terminal)
                session_db.commit()
                t_dict = {
                'time_connect': 60,
                'commands' : terminal.commands
                }
            return jsonify(t_dict)
        else:
            new_terminal = Terminal(title=content['name'], status='CONNECTION',lastframe='',last_time=datetime.now(), info='',time_connect = 1)
            session_db.add(new_terminal)
            session_db.commit()
            return ('TERMINAL ADD')
    return ('POST')
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.07.2022, 13:52
Ответы с готовыми решениями:

Подключить PostgreSQL к Flask API и передавать данные таблицы в flask
Нужна срочная и большая помощь, надеюсь только на вас. Есть Python+QT5 (PYQT5) приложение. В таблицу приложения (QTableWidget)...

HttpWebRequest, расход памяти непомерно больших объемов и , как следствие, утечка памяти
Добрый вечер. Мне была поставлена такая задача. Написать приложение, которая загружает из списка ссылки с сайта и ищет там определенную...

Вектор, утечка памяти, функция создания и выделение памяти
Здравствуйте. Есть проблема. функция malloc выделяет память лишь в функции CreateVector(), и при выходе из нее указатель теряется. Или не...

7
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,664
Записей в блоге: 29
18.07.2022, 15:19
moDorks, а при гет запросах что выполняется? там тысячи чтоль терминалов?
в дебаг режиме стартануть фласк, подключать терминалы и смотреть где много объектов создается и почему не чистятся
0
0 / 0 / 0
Регистрация: 18.01.2015
Сообщений: 88
19.07.2022, 12:45  [ТС]
При Гет запросы идут на другой ендпоинт который отдает json (каждые 7 секунд идет запрос если страница открыта), я собрал трейс через memory_profiler в основном

Python
1
617   1240.7 MiB      0.3 MiB           1           terminal = session_db.query(Terminal).filter_by(title=content['name']).one_or_none()
и

Python
1
   623   1243.6 MiB      0.3 MiB           1                   session_db.commit()
Предположение что из-за открытой глобальной сессии к БД ,
Python
1
2
3
4
5
engine = create_engine('sqlite:///terminals.db?check_same_thread=False')
Base.metadata.bind = engine
 
DBSession = sessionmaker(bind=engine)
session_db = DBSession()
однако я не нашел более подробно как можно это во фласке избежать (кроме как видео на PyCon19 Indian про tracemoll)
0
155 / 120 / 38
Регистрация: 12.12.2013
Сообщений: 374
19.07.2022, 22:13
Если сессии, то попробуй через контекстный менеджер типа
Python
1
with DBSession.begin() as session
Это самый простой пример, чтобы работало нужно еще проверять не открыта ли сейчас транзакция.
Есть короткая интересная статья: Правильно работаем с сессиями БД в SQLAlchemy. Возможно, как раз здесь подвисшие транзакции.

Ну и доки Алхимии: Session Basics
0
0 / 0 / 0
Регистрация: 18.01.2015
Сообщений: 88
20.07.2022, 14:33  [ТС]
Спасибо за наводку я почитал, часть уже применял от контекста до ограничения кеша, однако все равно через время выбивает ошибка сегментирования(дамп памяти сброшен на диск).
0
155 / 120 / 38
Регистрация: 12.12.2013
Сообщений: 374
21.07.2022, 09:39
Тогда здесь Пул соединений. Также там в самом низу есть про доп.аргументы (pool_size и max_overflow). Что, будет, если попробовать их увеличить?
Что такое lastframe? Это картинка или ссылка?
0
0 / 0 / 0
Регистрация: 18.01.2015
Сообщений: 88
21.07.2022, 13:35  [ТС]
lastframe картинка в строка (base64)

Добавлено через 1 час 12 минут
Установил pool_size 10 и оно активно начало память идти вниз , но все равно через определенный промежуток падает. \

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
engine = create_engine('sqlite:///terminals.db?check_same_thread=False')
Base.metadata.bind = engine
 
DBSession = sessionmaker(bind=engine)
 
#session_db_s = scoped_session(DBSession)
 
#session_db = session_db_s()
session_db = DBSession()
 
app.config['SECRET_KEY'] = 'apple pie'
app.config.update({
    'SQLALCHEMY_POOL_SIZE': 10,
    'SQLALCHEMY_POOL_TIMEOUT': 3,
    'SQLALCHEMY_MAX_OVERFLOW' : 20,
 
})
127.0.0.1 - - [21/Jul/2022 13:32:46] "POST /terminals/get-info HTTP/1.1" 200 -
Ошибка сегментирования (стек памяти сброшен на диск)

Как раз на Post, и я никак не могу отследить отчего, помимо memory_profiler и tracemoll есть ли еще инструменты под flask ?
0
155 / 120 / 38
Регистрация: 12.12.2013
Сообщений: 374
21.07.2022, 17:18
А где приложение стоит? Ресурсы сервера какие (память, диск)?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.07.2022, 17:18
Помогаю со студенческими работами здесь

Утечка памяти.
Доброго времени суток. У меня такая проблемка: программа вылетает после продолжительной работы, примерно несколько часов может работать...

Утечка памяти
Почему даже в пустом приложении, в котором весь код(кроме main) сгенерировала сама среда, идут довольно ощутимые утечки памяти, когда...

Утечка памяти
Не могу понять как избежать утечки памяти в своей программе... привожу кусок в одном из мест где на мой взгляд она происходит... Array...

Утечка памяти
Сворачиваю приложение в трей, затем убираю значок с панели задач, и тут начинается утечка памяти, через 3 часа приложение расходует 300мб...

Утечка памяти?!
Джесс Либерти и Дэвид Хорват "Освой самостоятельно С++ за 24 часа", вырезка из листинга 15.4 (стр 233): Строка 26 - Утечка памяти?...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru