Ночи доброй всем.
Собственно, интересует вопрос относительно memory leak'ов и корректного удаления объектов. Версия 4.2.2.6 (забыл указать сразу вначале).
Сейчас имею следующий код:
strategy.CancelActiveOrders();
strategy.ChildStrategies.DisposeAll();
strategy.DoDispose();
trader.Disconnect();
candleManager.Series.DoDispose();
candleManager.DoDispose();
series.DoDispose();
basketTrader.InnerConnectors.Remove(trader);
trader.DoDispose();
Здесь, соответственно, всё почти что стандартно, как в примерах. Но память течёт, и течёт неслабо так - за 30-40 прогонов забирает почти 16 гигов оперативы (тестирую на 4-х днях по RiH4, данные тащу из базы Гидры). Использую эмулятор торгов.
За сим, собственно, вопрос - какая стратегия очистки данных должна быть реализована? Помню, вопрос про утечки памяти поднимался ранее, но вроде же всё пофиксили?
Оффтоп вопрос - имеет ли смысл не пересоздавать каждый раз CandleManager и Series?
P.S. Подскажите, плз, какой-нибудь адекватный бесплатный профайлер для .NET.
Kommentare (8)
Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen
Доброго времени суток!
Можно еще strategy = null, trader = null обнулять, но выше указанных операций должно хватить с головой. Вряд ли поможет.
Мне кажется, что у вас с кодом что-то не так. Даже на S# тестере у меня не было таких утечек. Хотя, если тики, то может быть... Потому что, на сколько я помню, когда тестируешь на свечках после использования свечка уничтожается, чтобы не есть память.
Доброго времени суток!
Можно еще strategy = null, trader = null обнулять, но выше указанных операций должно хватить с головой. Вряд ли поможет.
Мне кажется, что у вас с кодом что-то не так. Даже на S# тестере у меня не было таких утечек. Хотя, если тики, то может быть... Потому что, на сколько я помню, когда тестируешь на свечках после использования свечка уничтожается, чтобы не есть память.
Не совсем. Тесты идут на RenkoCandle, которые из тихов формируются. В стаканогенераторе квант обновления - 15 миллисекунд. Да, тестирование именно многопоточное (Монте-Карло гоняю) с синхронизацией через SemaphoreSlim. strategy = null, trader = null - эффекта ноль. Т.е. память всё же где-то накапливается, что странно, конечно, т.к. нигде навроде привязок внешних объектов ни к стратегии, ни к трейдеру навроде не идёт, чтобы они могли зависнуть на неопределённо долгий срок и не мочь быть собранными сборщиком мусора.
Сейчас попробую 4.2.2.15, до этого тесты были на 4.2.2.6
Собственно, и хочу разобраться, что к чему - хочу понять стратегию удаления объектов, связанных со стратегией и трейдером. Потому как скорее всего проблемы именно у меня. Опять же, оффтоп, - порекомендуйте нормальный халявный профайлер для .NET, чтобы не шаровварный был.
Да, и ещё вопрос - как убрать в CandleManager'е временные отрезки, в которых не нужно генерировать ничего? Т.е. чтобы у меня CandleManager шпарил данные только с 10:00 до 18:50? Можно кусочек кода маленький? Плз!
думаю где-то здесь собака зарыта, CandleSeries.WorkingTime но не проверял, догадка
Я заметил, что несмотря на то, что я ставлю UseCandlesTimeFrame = timeFrame, S# все равно тянет из базы тики и налету формирует свечки. При этом память жрется дико, так что если прогонять несколько стратегий последовательно - может память и утекает на копии одного дня тиков на разные стратегии
Как заставить S# смотреть сразу свечки я не нашел, это вообще можно сделать?
Насчёт этого не знаю, если честно, - тут нужно на курсы идти. Насчёт отжирания оперативы - я просто после каждого прогона чищу за собой, но постепенно память утекает. Т.е. первые 10 нитей отрабатыают на 6-8 гб, потом постепенно на 20-30 нитях дорастает до 11-12 гб, дальше уже начинается тупняк. Я просто пулами по 10-15 нитей запускаю, каждая нить у меня к моему планировщику вызовов к R коннектится (точнее, каждый индикатор независимо это делает по tcp/ip).
А может кто бесплатный профайлер указать, который бы мог мну помочь?
Ключевой элемент:
Не буду утверждать что я смог таким образом устранить утечку, но память начала освобождаться.
Да, ещё такой вопросинг - а сколько жрёт график PnL'я? Просто я отрисовываю для каждого прогона PnL, чтобы посмотреть распределение относительно 0 профита/лосса. Может, из-за этого память забивается? Сегодня попробую налабать тестер без визуализации - посмотрим на скорость и мемори лики, о результатах сообщу.
Rebelion,сними снимок памяти и посмотри...но по моим наблюдениям не много она жрет, по крайнее мере терпимо, а вот что действительно разростается, так это всевозможные коллекции с обьектом trade...они и жрут память...у самого такая же фигня как у вас, правда до 16 гигов не доходило никогда, максимум 1-1,5 при торговле...на втором месте transaction и на третьем orders...остальное все не существенно...