Утечки памяти при бэктестинге
Atom Ответить
21.02.2014


Ночи доброй всем.

Собственно, интересует вопрос относительно 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.

Теги:


Спасибо:




8 Ответов
Bond

Фотография
Курсы
Дата: 22.02.2014
Ответить


Доброго времени суток!
Цитата:
Здесь, соответственно, всё почти что стандартно, как в примерах. Но память течёт, и течёт неслабо так - за 30-40 прогонов забирает почти 16 гигов оперативы (тестирую на 4-х днях по RiH4, данные тащу из базы Гидры). Использую эмулятор торгов.

Хардкор. На тиках тестируете?

Можно еще strategy = null, trader = null обнулять, но выше указанных операций должно хватить с головой. Вряд ли поможет.

Цитата:
Оффтоп вопрос - имеет ли смысл не пересоздавать каждый раз CandleManager и Series?

Если многопоточное тестирование, то имеет. А так вроде не принципиально.

Мне кажется, что у вас с кодом что-то не так. Даже на S# тестере у меня не было таких утечек. Хотя, если тики, то может быть...
Потому что, на сколько я помню, когда тестируешь на свечках после использования свечка уничтожается, чтобы не есть память.
Спасибо:

devruss

Фотография
Курсы
Дата: 22.02.2014
Ответить


Я заметил, что несмотря на то, что я ставлю UseCandlesTimeFrame = timeFrame, S# все равно тянет из базы тики и налету формирует свечки. При этом память жрется дико, так что если прогонять несколько стратегий последовательно - может память и утекает на копии одного дня тиков на разные стратегии

Как заставить S# смотреть сразу свечки я не нашел, это вообще можно сделать?
Спасибо:

Rebelion

Фотография
Курсы
Дата: 22.02.2014
Ответить


devruss Перейти
Я заметил, что несмотря на то, что я ставлю UseCandlesTimeFrame = timeFrame, S# все равно тянет из базы тики и налету формирует свечки. При этом память жрется дико, так что если прогонять несколько стратегий последовательно - может память и утекает на копии одного дня тиков на разные стратегии

Как заставить S# смотреть сразу свечки я не нашел, это вообще можно сделать?


Насчёт этого не знаю, если честно, - тут нужно на курсы идти.
Насчёт отжирания оперативы - я просто после каждого прогона чищу за собой, но постепенно память утекает. Т.е. первые 10 нитей отрабатыают на 6-8 гб, потом постепенно на 20-30 нитях дорастает до 11-12 гб, дальше уже начинается тупняк. Я просто пулами по 10-15 нитей запускаю, каждая нить у меня к моему планировщику вызовов к R коннектится (точнее, каждый индикатор независимо это делает по tcp/ip).

А может кто бесплатный профайлер указать, который бы мог мну помочь?
Автор топика
Спасибо:

Rebelion

Фотография
Курсы
Дата: 22.02.2014
Ответить


Bond Перейти
Доброго времени суток!
Цитата:
Здесь, соответственно, всё почти что стандартно, как в примерах. Но память течёт, и течёт неслабо так - за 30-40 прогонов забирает почти 16 гигов оперативы (тестирую на 4-х днях по RiH4, данные тащу из базы Гидры). Использую эмулятор торгов.

Хардкор. На тиках тестируете?

Можно еще strategy = null, trader = null обнулять, но выше указанных операций должно хватить с головой. Вряд ли поможет.

Цитата:
Оффтоп вопрос - имеет ли смысл не пересоздавать каждый раз CandleManager и Series?

Если многопоточное тестирование, то имеет. А так вроде не принципиально.

Мне кажется, что у вас с кодом что-то не так. Даже на S# тестере у меня не было таких утечек. Хотя, если тики, то может быть...
Потому что, на сколько я помню, когда тестируешь на свечках после использования свечка уничтожается, чтобы не есть память.



Не совсем. Тесты идут на RenkoCandle, которые из тихов формируются. В стаканогенераторе квант обновления - 15 миллисекунд.
Да, тестирование именно многопоточное (Монте-Карло гоняю) с синхронизацией через SemaphoreSlim.
strategy = null, trader = null - эффекта ноль. Т.е. память всё же где-то накапливается, что странно, конечно, т.к. нигде навроде привязок внешних объектов ни к стратегии, ни к трейдеру навроде не идёт, чтобы они могли зависнуть на неопределённо долгий срок и не мочь быть собранными сборщиком мусора.

Сейчас попробую 4.2.2.15, до этого тесты были на 4.2.2.6

Собственно, и хочу разобраться, что к чему - хочу понять стратегию удаления объектов, связанных со стратегией и трейдером. Потому как скорее всего проблемы именно у меня.
Опять же, оффтоп, - порекомендуйте нормальный халявный профайлер для .NET, чтобы не шаровварный был.

Да, и ещё вопрос - как убрать в CandleManager'е временные отрезки, в которых не нужно генерировать ничего? Т.е. чтобы у меня CandleManager шпарил данные только с 10:00 до 18:50? Можно кусочек кода маленький? Плз!
Автор топика
Спасибо:

Andrii

Фотография
Дата: 23.02.2014
Ответить


Rebelion Перейти

Да, и ещё вопрос - как убрать в CandleManager'е временные отрезки, в которых не нужно генерировать ничего? Т.е. чтобы у меня CandleManager шпарил данные только с 10:00 до 18:50? Можно кусочек кода маленький? Плз!


думаю где-то здесь собака зарыта, CandleSeries.WorkingTime
но не проверял, догадка
Спасибо:

AntonySS

Фотография
Курсы Автор статей
Дата: 23.02.2014
Ответить


Rebelion Перейти
Ночи доброй всем.

Собственно, интересует вопрос относительно 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.



Добрый день!

Некоторое время назад столкнулся с аналогичной проблемой https://stocksharp.ru/forum/430...kak-unichtozhit--obiekt/

Метод Dispose не помогал, поэтому я подумал и решил что раз избавиться от объемного объекта не получается, то нужно создать вместо него новый, но пустой и соответственно маленький

Сделал я следующее

Код
									strategy.Stop();
									candleManager.Stop(candleSeries);
									if (strategy.Connector != null) strategy.Connector.Dispose();
									strategy.Dispose();
									strategy.Connector = null;
									strategy = null;
									candleSeries = null;
									candleManager.Container = new CandleManagerContainer();
									if (candleManager != null) candleManager.Dispose();
									if (connector.MarketEmulator != null) connector.MarketEmulator.Dispose();
									if (connector != null) connector.Dispose();
									if (StorageRegistry != null) StorageRegistry.DoDispose();
									if (LogManager != null) LogManager.Dispose();
									if (security != null) security.DoDispose();
									candleManager = null;
									connector = null;
									StorageRegistry = null;
									LogManager = null;
									basketConnector = null;
									security = null;


Ключевой элемент:
Код
candleManager.Container = new CandleManagerContainer();


Не буду утверждать что я смог таким образом устранить утечку, но память начала освобождаться.
Спасибо: Rebelion

Rebelion

Фотография
Курсы
Дата: 25.02.2014
Ответить


Да, ещё такой вопросинг - а сколько жрёт график PnL'я? Просто я отрисовываю для каждого прогона PnL, чтобы посмотреть распределение относительно 0 профита/лосса. Может, из-за этого память забивается? Сегодня попробую налабать тестер без визуализации - посмотрим на скорость и мемори лики, о результатах сообщу.
Автор топика
Спасибо:

casper-ss

Фотография
Благотворитель
Дата: 26.02.2014
Ответить


Rebelion,сними снимок памяти и посмотри...но по моим наблюдениям не много она жрет, по крайнее мере терпимо, а вот что действительно разростается, так это всевозможные коллекции с обьектом trade...они и жрут память...у самого такая же фигня как у вас, правда до 16 гигов не доходило никогда, максимум 1-1,5 при торговле...на втором месте transaction и на третьем orders...остальное все не существенно...
Спасибо:


Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy