Closed LostonBell closed 10 months ago
Я понимаю, что вопрос кроется в памяти (скорее всего). Но возможно ли просто разбивать каким-либо образом файл в записи? Чтобы не ранить все записи в памяти до момента записи в файл. Это явно усложняет все в плане оптимизации
Я сделяль.
Я надеюсь это кому-то пригодиться (тем более я видел стэк с такой проблемой у других пользователей в закрытых ранее) Нужно заменить код в 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. Мне помогло :)
А нет. Ошибка правда не в оперативной памяти. Она держалась оптимально, но на отметке в 2800 все равно обрывает постоянно. Дело кажется в чем-то другом.
А нет. Ошибка правда не в оперативной памяти. Она держалась оптимально, но на отметке в 2800 все равно обрывает постоянно. Дело кажется в чем-то другом.
Ошибка в том что 2гис выводит все на одной странице и памяти не хватает не в буфере обмена, а чтобы прогружать эту страницу с несколькими тысячами записей
У кого-то получилось решить данную проблему?
Дублика #41, нужна доработка с восстановлением работы с последней страницы.
Добрый вечер! После парсинга результатов свыше 2500 ед. - происходит ошибка. Приходит сообщение "Браузер закрыт"