WLM1ke / poptimizer

Оптимизация долгосрочного портфеля акций
The Unlicense
154 stars 28 forks source link

CursorNotFound #66

Closed RomaKoks closed 3 years ago

RomaKoks commented 3 years ago

Подскажите пожалуйста с чем эта может быть связана, и как её лечить/избегать:

Forecasts: 101it [23:21, 13.88s/it]
Traceback (most recent call last):
  File "PATH_TO\poptimizer\optimize.py", line 12, in opt
    optimize(date, ports=ports)
  File "PATH_TO\poptimizer\poptimizer\__main__.py", line 23, in optimize
    opt = Optimizer(port)
  File "PATH_TO\poptimizer\poptimizer\portfolio\optimizer.py", line 38, in __init__
    self._metrics = metrics.MetricsResample(portfolio)
  File "PATH_TO\poptimizer\poptimizer\portfolio\metrics.py", line 158, in __init__
    for forecast in evolve.get_forecasts(tickers, date):
  File "PATH_TO\poptimizer\poptimizer\evolve\forecaster.py", line 142, in get_forecasts
    return cache()
  File "PATH_TO\poptimizer\poptimizer\evolve\forecaster.py", line 98, in __call__
    return self._create_cache()
  File "PATH_TO\poptimizer\poptimizer\evolve\forecaster.py", line 116, in _create_cache
    forecasts = Forecasts(self._tickers, self._date)
  File "PATH_TO\poptimizer\poptimizer\evolve\forecaster.py", line 31, in __init__
    self._forecasts = forecasts or _prepare_forecasts(tickers, date)
  File "PATH_TO\poptimizer\poptimizer\evolve\forecaster.py", line 61, in _prepare_forecasts
    for organism in tqdm.tqdm(population.get_oldest(), desc="Forecasts"):
  File "PATH_TO\anaconda3\envs\finan\lib\site-packages\tqdm\std.py", line 1185, in __iter__
    for obj in iterable:
  File "PATH_TO\poptimizer\poptimizer\evolve\population.py", line 249, in get_oldest
    for id_dict in collection.aggregate(pipeline):
  File "PATH_TO\anaconda3\envs\finan\lib\site-packages\pymongo\command_cursor.py", line 259, in next
    doc = self._try_next(True)
  File "PATH_TO\anaconda3\envs\finan\lib\site-packages\pymongo\command_cursor.py", line 270, in _try_next
    self._refresh()
  File "PATH_TO\anaconda3\envs\finan\lib\site-packages\pymongo\command_cursor.py", line 196, in _refresh
    self.__send_message(
  File "PATH_TO\anaconda3\envs\finan\lib\site-packages\pymongo\command_cursor.py", line 139, in __send_message
    response = client._run_operation_with_response(
  File "PATH_TO\anaconda3\envs\finan\lib\site-packages\pymongo\mongo_client.py", line 1368, in _run_operation_with_response
    return self._retryable_read(
  File "PATH_TO\anaconda3\envs\finan\lib\site-packages\pymongo\mongo_client.py", line 1471, in _retryable_read
    return func(session, server, sock_info, slave_ok)
  File "PATH_TO\anaconda3\envs\finan\lib\site-packages\pymongo\mongo_client.py", line 1360, in _cmd
    return server.run_operation_with_response(
  File "PATH_TO\anaconda3\envs\finan\lib\site-packages\pymongo\server.py", line 135, in run_operation_with_response
    _check_command_response(first, sock_info.max_wire_version)
  File "PATH_TO\anaconda3\envs\finan\lib\site-packages\pymongo\helpers.py", line 162, in _check_command_response
    raise CursorNotFound(errmsg, code, response, max_wire_version)
pymongo.errors.CursorNotFound: cursor id 9024041513465701594 not found, full error: {'ok': 0.0, 'errmsg': 'cursor id 9024041513465701594 not found', 'code': 43, 'codeName': 'CursorNotFound'}

Если дать больше вычислительных ресурсов, то отрабатывает нормально:

Forecasts: 116it [10:30,  5.43s/it]
ПОРТФЕЛЬ - 2021-10-29

Первая ссылка по поводу говорит, что сюда https://github.com/WLM1ke/poptimizer/blob/084ac14ca6212a5b14bea5bbc9bb575da077ffb0/poptimizer/evolve/population.py#L239 можно добавить параметр no_cursor_timeout=True

в ту сторону смотрю? там правда есть уточнение not valid at server, а здесь такого нет...

WLM1ke commented 3 years ago

Не сталкивался с таким. В ближайшие пару недель я без компьютера — не смогу проверить. Видимо действительно курсор умирает прежде, чем все посчитается. Отключать timeout мне кажется не хорошо. Более разумно забрать все данные из базы, а потом неспешно считать.

https://github.com/WLM1ke/poptimizer/blob/084ac14ca6212a5b14bea5bbc9bb575da077ffb0/poptimizer/evolve/population.py#L245

То есть эту строчку поменять на что-нибудь вроде:

for id_dict in list(collection.aggregate(pipeline)):