Утечки памяти при бэктестинге
Atom
22.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.


Теги:


Спасибо:


Bond

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


Доброго времени суток!

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

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

Оффтоп вопрос - имеет ли смысл не пересоздавать каждый раз CandleManager и Series? Если многопоточное тестирование, то имеет. А так вроде не принципиально.

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

Спасибо:

devruss

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


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

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

Спасибо:

Rebelion

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


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

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

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

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

Спасибо:

Rebelion

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


Доброго времени суток!

Здесь, соответственно, всё почти что стандартно, как в примерах. Но память течёт, и течёт неслабо так - за 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.


Добрый день!

Некоторое время назад столкнулся с аналогичной проблемой <http://stocksharp.com/forum/4304/LinkedListNode----kak-unichtozhit--obiekt/>

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

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

```csharp
									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