Является ли нормальным явление, когда процесс парсинга потребляет большое количество оперативной памяти?

Добрый день/утро/вечер! Я хотел бы получить мнение сообщества о производительности моей программы. У меня есть парсер, который обрабатывает веб-страницы, собирает ссылки и сохраняет их в файл. Однако я заметил, что в диспетчере задач программа занимает 300 МБ памяти, и этот объем продолжает увеличиваться. Это нормально, или я допустил ошибку в коде? Программа работает, но меня беспокоит потребление ресурсов. 

Вот сам код: 
<pre><code class="python">from urllib.request import urlopen
import time
from bs4 import BeautifulSoup
def Parse(url) -> list:
    ###ссылка на сайт 
    inner_html_code = str(urlopen(url))
    inner_soup = BeautifulSoup(inner_html_code, "html.parser")
    inner_soup = inner_soup.find("body")
    inner_soup = (inner_soup.find_all("td", {'valign':"top", "width":"150"}))
    list = []
    for a in inner_soup:
        if a.find("a"):
            list.append((###ссылка))
    return list
for i in range(25,5025,25):
    list = Parse(i)
    with open("D:\Result\Result.txt", "a" ) as F:
        for a in list:
            F.writelines(a + '\n')
    time.sleep(90)</code></pre>
  • 17 ноября 2024 г. 11:53
Ответы на вопрос 2
Добрый день!

Употребление памяти в процессе парсинга действительно может быть высоким, особенно если вы обрабатываете большое количество данных или если ваш код не оптимален. Нормально ли использование 300 МБ оперативной памяти, зависит от нескольких факторов, таких как размеры загружаемых веб-страниц, количество извлекаемых данных и структура вашего кода.

Вот несколько моментов, которые стоит учесть и, возможно, улучшить:

1. **Управление памятью**: Ваша программа может не освобождать память, если хранит ссылки или другие объекты в памяти длительное время. Это может происходить, если вы создаете много временных объектов без их очистки. Убедитесь, что вы правильно используете и освобождаете неиспользуемые объекты.

2. **Обработка строк**: Преобразование HTML-кода в строку с помощью `str(urlopen(url))` может быть неоптимальным. Вместо этого лучше использовать `urlopen(url).read()`, который вернет байтовую строку, и затем декодировать её в нужную кодировку.

3. **Обработка больших объемов данных**: Если ваша программа собирает много ссылок, попробуйте ограничить количество извлекаемых данных. Возможно, полезно будет устанавливать ограничение на количество найденных ссылок.

4. **Проверка утечек памяти**: Используйте инструменты для профилирования памяти (например, `memory_profiler`), чтобы идентифицировать, какие объекты занимают больше всего памяти.

5. **Постепенная загрузка**: Если данные, с которыми вы работаете, огромны, подумайте о том, чтобы загружать и обрабатывать данные пакетами, а не загружать всё сразу.

6. **Закрытие файлов**: Отключайте и закрывайте ресурсы. Используйте контекстный менеджер (`with`) для работы с файлами, как вы уже делаете, чтобы убедиться, что файлы правильно закрываются.

Пример улучшенного кода может выглядеть так:

```python
from urllib.request import urlopen
import time
from bs4 import BeautifulSoup

def parse(url) -> list:
    # Получаем HTML-код
    inner_html_code = urlopen(url).read()  # Используем read() вместо str()
    inner_soup = BeautifulSoup(inner_html_code, "html.parser")
    
    inner_body = inner_soup.find("body")
    items = inner_body.find_all("td", {'valign': "top", "width": "150"})
    
    links = []
    for item in items:
        if item.find("a"):
            # Добавьте логику для извлечения ссылок
            link = item.find("a")['href']
            links.append(link)
    
    return links

for i in range(25, 5025, 25):
    link_list = parse(f'http://example.com/page/{i}')  # Пример URL
    with open(r"D:\Result\Result.txt", "a") as f:  # Убедитесь, что путь правильный
        for link in link_list:
            f.write(link + '\n')
    
    time.sleep(90)
```

Этот код должен помочь оптимизировать ваше потребление памяти и повысить производительность. Убедитесь также, что вы используете актуальную версию необходимых библиотек. Если проблема с памятью остается, возможно, потребуется более детальный анализ.
Профилировщик - загуглить, что это такое и прийти сюда с более конкретными вопросами. 
Профилирование Python — почему и где тормозит ваш код
Похожие вопросы