← Zurück

Утечки памяти при бэктестинге

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

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

War dieses Thema hilfreich?

Thema teilen

Kommentare (8)

Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen

Bond
Bond

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

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

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

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

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

Rebelion
Rebelion Autor

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

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

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

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

devruss
devruss

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

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

Rebelion
Rebelion Autor

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

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

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

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

AntonySS
AntonySS

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
Rebelion Autor

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

casper-ss
casper-ss

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