Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ошибка после парсинга 2500 результатов #25

Closed
LostonBell opened this issue Mar 11, 2023 · 6 comments
Closed

Comments

@LostonBell
Copy link

Добрый вечер! После парсинга результатов свыше 2500 ед. - происходит ошибка. Приходит сообщение "Браузер закрыт"

2023-03-11-19-29-05

@LostonBell
Copy link
Author

Я понимаю, что вопрос кроется в памяти (скорее всего). Но возможно ли просто разбивать каким-либо образом файл в записи? Чтобы не ранить все записи в памяти до момента записи в файл. Это явно усложняет все в плане оптимизации

@LostonBell
Copy link
Author

LostonBell commented Mar 12, 2023

Я сделяль.

Я надеюсь это кому-то пригодиться (тем более я видел стэк с такой проблемой у других пользователей в закрытых ранее)
Нужно заменить код в json_writter.py на этот:

from __future__ import annotations

import json
import os
from typing import Any

from ...logger import logger
from .file_writer import FileWriter


class JSONWriter(FileWriter):
    """Writer to JSON file."""
    def __init__(self, filename: str, options: dict = None) -> None:
        super().__init__(filename, options)
        self._wrote_count = 0
        self._filename = filename

    def __enter__(self) -> JSONWriter:
        super().__enter__()
        self._wrote_count = 0
        self._file.write('[')
        return self

    def __exit__(self, *exc_info) -> None:
        if self._wrote_count > 0:
            self._file.write(os.linesep)
        self._file.write(']')
        super().__exit__(*exc_info)

    def _writedoc(self, catalog_doc: Any) -> None:
        """Write a `catalog_doc` into JSON document."""
        item = catalog_doc['result']['items'][0]

        if self._options.verbose:
            try:
                name = item['name_ex']['primary']
            except KeyError:
                name = '...'

            logger.info('Парсинг [%d] > %s', self._wrote_count + 1, name)

        # Записываем каждую запись в файл сразу же
        with open(self._filename, 'a', encoding='utf-8') as f:
            if self._wrote_count > 0:
                f.write(',')
            f.write(os.linesep)
            f.write(json.dumps(item, ensure_ascii=False))

        self._wrote_count += 1

    def write(self, catalog_doc: Any) -> None:
        """Write Catalog Item API JSON document down to JSON file.
        Args:
            catalog_doc: Catalog Item API JSON document.
        """
        if not self._check_catalog_doc(catalog_doc):
            return

        self._writedoc(catalog_doc)

Тут я написал все так, чтобы результат сразу записывался в json файл и не хранился в памяти. А далее он просто обновлялся в конец json. Мне помогло :)

@LostonBell
Copy link
Author

А нет. Ошибка правда не в оперативной памяти. Она держалась оптимально, но на отметке в 2800 все равно обрывает постоянно. Дело кажется в чем-то другом.

@Svist122
Copy link

А нет. Ошибка правда не в оперативной памяти. Она держалась оптимально, но на отметке в 2800 все равно обрывает постоянно. Дело кажется в чем-то другом.

Ошибка в том что 2гис выводит все на одной странице и памяти не хватает не в буфере обмена, а чтобы прогружать эту страницу с несколькими тысячами записей

@ma4ypic4y
Copy link

У кого-то получилось решить данную проблему?

@interlark
Copy link
Owner

Дублика #41, нужна доработка с восстановлением работы с последней страницы.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants