#python #memory #while-loop #os.system
#python #память #цикл while #os.system
Вопрос:
Я использую Python для поиска на веб-сайте определенных ссылок или ключевых слов и хочу отправлять запрос примерно каждые 5 секунд. Изначально я использовал while True
цикл для отправки своих запросов каждые 5 секунд, но с каждым циклом моя программа использовала примерно на 1 мб памяти больше, чем раньше. Поскольку я хочу запускать свою программу на Raspberry Pi в течение потенциально нескольких дней, это довольно быстро заполнило бы память.
Вместо использования цикла while True, как только моя программа выполнила весь код, который я использую
os.system("python program.py")
перезапуск программы, означающий повторное выполнение кода, не приведет к увеличению объема памяти и останется в среднем около 38 мб.
Итак, мой вопрос: есть ли какой-либо недостаток в том, что я это делаю? Могут ли возникнуть какие-либо проблемы, если я хочу, чтобы мой компьютер запускал новый экземпляр программы каждые 5 секунд в течение нескольких дней?
РЕДАКТИРОВАТЬ: добавлен код
import requests
from bs4 import BeautifulSoup, SoupStrainer
import time
import os
import psutil
while True:
url = "https://en.wikipedia.org/wiki/Main_Page"
source = requests.get(url).text
soup = BeautifulSoup(source, 'lxml')
for link in soup.find_all("a"):
print(link.get('href'))
time.sleep(5)
process = psutil.Process(os.getpid())
print(process.memory_info().rss)
time.sleep(5)
Комментарии:
1. Если потребление памяти увеличивается, это означает, что у вас, вероятно, утечка памяти. Вместо перезапуска приложения устраните проблему с утечкой памяти.
2. Если вы хотите перезапустить свою программу и просто удалить все накопленные данные, это говорит о том, что вы сохраняете данные в каждом цикле, которые вам не нужны. Не видя вашего кода, невозможно понять, почему объем памяти увеличивается, но очевидно, что вы этого не собираетесь
3. На мой взгляд, это классическая проблема XY .
4. @zvone Я добавил код, который, по сути, и есть то, что я делаю, но даже этот простой код приводит к тому, что моя память загружается при каждом цикле. Он начался с 32 мб и увеличивается примерно на 0,7 Мб за каждый цикл.
5. Похоже, это случай преждевременной оптимизации. Утечки памяти нет. Когда я запускаю этот код без
time.sleep
(поэтому потребление памяти растет намного быстрее), она всегда остается на уровне около 50 МБ (как и ожидалось). Это нормально, что иногда он повышается по разным причинам, и это происходит, но затем он снова падает. Итак, все в порядке.
Ответ №1:
Честно говоря, звучит так, как будто программу следует переписать. Если вы храните данные внутри, которые вам не нужны (что, судя по звукам, так и есть), вам нужно спросить себя, почему вы это делаете. Если вам нужны эти данные, запишите их и сбросьте переменную.
Здесь действительно помогло бы немного больше ясности, то есть в самом коде, чтобы мы могли выяснить реальную проблему.
Комментарии:
1. Я добавил код, который, по сути, является тем, что я делаю, но даже этот простой код приводит к тому, что моя память загружается при каждом цикле. Он начался с 32 мб и увеличивается примерно на 0,7 Мб за каждый цикл.
2. Instagram делает это. У них есть какой-то сервер, который работает до тех пор, пока потребление памяти не станет высоким, затем они перезапускают его. Честно говоря, они использовали модифицированную версию CPython с отключенным сборщиком мусора. Это не была утечка памяти, подобная той, что в вопросе.