- При указании в настройках целевой директории присутствует выбор между целевой директорией и директорией программы. Причём последняя выбрана по-умолчанию. Не знаю фича это или косяк, но выглядит, как косяк.
- Архитектурно программа везде вместо построчной обработки использует списки.
Команда
Storage.GetTradeStorage(Security, SourcePath.SelectedSource)
.Load(FromDate, ToDate + TimeSpan.FromTicks(TimeSpan.TicksPerDay - 1))
вызывает волшебный метод
public IEnumerable<\u0023\u003DqdDI3Y3B9NuGEyhuWEKOMQw\u003D\u003D> Load(DateTime \u0023\u003DqjMNbSyHi2wSfqMTxwOFw5w\u003D\u003D, DateTime \u0023\u003DqLRw2isZu\u0024Gi2kSql74F4hw\u003D\u003D)
{
Func<\u0023\u003DqdDI3Y3B9NuGEyhuWEKOMQw\u003D\u003D, \u0023\u003DqEF80Yvamo98ZmPyDgj9S83tqQZUTw9Y1GwDqtxtmj2w\u003D<\u0023\u003DqdDI3Y3B9NuGEyhuWEKOMQw\u003D\u003D, DateTime>> func1 = (Func<\u0023\u003DqdDI3Y3B9NuGEyhuWEKOMQw\u003D\u003D, \u0023\u003DqEF80Yvamo98ZmPyDgj9S83tqQZUTw9Y1GwDqtxtmj2w\u003D<\u0023\u003DqdDI3Y3B9NuGEyhuWEKOMQw\u003D\u003D, DateTime>>) null;
Func<\u0023\u003DqEF80Yvamo98ZmPyDgj9S83tqQZUTw9Y1GwDqtxtmj2w\u003D<\u0023\u003DqdDI3Y3B9NuGEyhuWEKOMQw\u003D\u003D, DateTime>, bool> func2 = (Func<\u0023\u003DqEF80Yvamo98ZmPyDgj9S83tqQZUTw9Y1GwDqtxtmj2w\u003D<\u0023\u003DqdDI3Y3B9NuGEyhuWEKOMQw\u003D\u003D, DateTime>, bool>) null;
\u0023\u003DqjscC_sD__Wz1R8OrZhlzyOI5tzzg7BToUBKXwTVqZO84NhphJRI0eyRNGeGaeg0l<\u0023\u003DqdDI3Y3B9NuGEyhuWEKOMQw\u003D\u003D, \u0023\u003DqAS4sOB3tWVQahGWJQZAVyQ\u003D\u003D, \u0023\u003DqBue7tPpoVUuUSzCh\u0024R8o6w\u003D\u003D>.\u0023\u003DqwQ1\u00246I4BPH\u0024l6LQCfG2RNtCtg2ZDZArxsDUMsokwWOY\u003D zdzArxsDuMsokwWoY = new \u0023\u003DqjscC_sD__Wz1R8OrZhlzyOI5tzzg7BToUBKXwTVqZO84NhphJRI0eyRNGeGaeg0l<\u0023\u003DqdDI3Y3B9NuGEyhuWEKOMQw\u003D\u003D, \u0023\u003DqAS4sOB3tWVQahGWJQZAVyQ\u003D\u003D, \u0023\u003DqBue7tPpoVUuUSzCh\u0024R8o6w\u003D\u003D>.\u0023\u003DqwQ1\u00246I4BPH\u0024l6LQCfG2RNtCtg2ZDZArxsDUMsokwWOY\u003D();
zdzArxsDuMsokwWoY.\u0023\u003DqNggpJclGeVDD_hTLp8iTTQ\u003D\u003D = param0;
zdzArxsDuMsokwWoY.\u0023\u003Dq0tOGvj3TpUouN1ux_qLJ0g\u003D\u003D = param1;
zdzArxsDuMsokwWoY.\u0023\u003DqatTwgFVaPtUxSGplmCWi_A\u003D\u003D = this;
if (zdzArxsDuMsokwWoY.\u0023\u003DqNggpJclGeVDD_hTLp8iTTQ\u003D\u003D > zdzArxsDuMsokwWoY.\u0023\u003Dq0tOGvj3TpUouN1ux_qLJ0g\u003D\u003D)
throw new ArgumentOutOfRangeException(\u0023\u003DqiynfM61BKwvyYrVfBhgEI\u0024B5hL7s98VPGwOBoMznNsE\u003D.\u0023\u003DqZv2ypaOXYNZbZulAOMdGVg\u003D\u003D(-615884728), (object) zdzArxsDuMsokwWoY.\u0023\u003Dq0tOGvj3TpUouN1ux_qLJ0g\u003D\u003D, \u0023\u003DqiynfM61BKwvyYrVfBhgEI\u0024B5hL7s98VPGwOBoMznNsE\u003D.\u0023\u003DqZv2ypaOXYNZbZulAOMdGVg\u003D\u003D(-615888671));
List<\u0023\u003DqdDI3Y3B9NuGEyhuWEKOMQw\u003D\u003D> list1 = new List<\u0023\u003DqdDI3Y3B9NuGEyhuWEKOMQw\u003D\u003D>();
zdzArxsDuMsokwWoY.\u0023\u003DqNggpJclGeVDD_hTLp8iTTQ\u003D\u003D = MathHelper.Max(zdzArxsDuMsokwWoY.\u0023\u003DqNggpJclGeVDD_hTLp8iTTQ\u003D\u003D, this.FromDate);
if (zdzArxsDuMsokwWoY.\u0023\u003Dq0tOGvj3TpUouN1ux_qLJ0g\u003D\u003D > this.ToDate)
zdzArxsDuMsokwWoY.\u0023\u003Dq0tOGvj3TpUouN1ux_qLJ0g\u003D\u003D = this.ToDate.AddTicks(863999999999L);
for (DateTime dateTime = zdzArxsDuMsokwWoY.\u0023\u003DqNggpJclGeVDD_hTLp8iTTQ\u003D\u003D.Date; dateTime <= zdzArxsDuMsokwWoY.\u0023\u003Dq0tOGvj3TpUouN1ux_qLJ0g\u003D\u003D; dateTime = dateTime.AddDays(1.0))
{
List<\u0023\u003DqdDI3Y3B9NuGEyhuWEKOMQw\u003D\u003D> list2 = list1;
List<\u0023\u003DqdDI3Y3B9NuGEyhuWEKOMQw\u003D\u003D> list3 = this.\u0023\u003Dqku2X1xXOuql\u0024Cu2tld76CA\u003D\u003D(dateTime);
if (func1 == null)
func1 = new Func<\u0023\u003DqdDI3Y3B9NuGEyhuWEKOMQw\u003D\u003D, \u0023\u003DqEF80Yvamo98ZmPyDgj9S83tqQZUTw9Y1GwDqtxtmj2w\u003D<\u0023\u003DqdDI3Y3B9NuGEyhuWEKOMQw\u003D\u003D, DateTime>>(this.\u0023\u003DqXCeEZYtkCEra\u0024qrnqe9hEw\u003D\u003D);
Func<\u0023\u003DqdDI3Y3B9NuGEyhuWEKOMQw\u003D\u003D, \u0023\u003DqEF80Yvamo98ZmPyDgj9S83tqQZUTw9Y1GwDqtxtmj2w\u003D<\u0023\u003DqdDI3Y3B9NuGEyhuWEKOMQw\u003D\u003D, DateTime>> selector1 = func1;
IEnumerable<\u0023\u003DqEF80Yvamo98ZmPyDgj9S83tqQZUTw9Y1GwDqtxtmj2w\u003D<\u0023\u003DqdDI3Y3B9NuGEyhuWEKOMQw\u003D\u003D, DateTime>> source1 = Enumerable.Select<\u0023\u003DqdDI3Y3B9NuGEyhuWEKOMQw\u003D\u003D, \u0023\u003DqEF80Yvamo98ZmPyDgj9S83tqQZUTw9Y1GwDqtxtmj2w\u003D<\u0023\u003DqdDI3Y3B9NuGEyhuWEKOMQw\u003D\u003D, DateTime>>((IEnumerable<\u0023\u003DqdDI3Y3B9NuGEyhuWEKOMQw\u003D\u003D>) list3, selector1);
if (func2 == null)
func2 = new Func<\u0023\u003DqEF80Yvamo98ZmPyDgj9S83tqQZUTw9Y1GwDqtxtmj2w\u003D<\u0023\u003DqdDI3Y3B9NuGEyhuWEKOMQw\u003D\u003D, DateTime>, bool>(zdzArxsDuMsokwWoY.\u0023\u003DqLaIGTCyJSPHR2oI13wYb1A\u003D\u003D);
Func<\u0023\u003DqEF80Yvamo98ZmPyDgj9S83tqQZUTw9Y1GwDqtxtmj2w\u003D<\u0023\u003DqdDI3Y3B9NuGEyhuWEKOMQw\u003D\u003D, DateTime>, bool> predicate = func2;
IEnumerable<\u0023\u003DqEF80Yvamo98ZmPyDgj9S83tqQZUTw9Y1GwDqtxtmj2w\u003D<\u0023\u003DqdDI3Y3B9NuGEyhuWEKOMQw\u003D\u003D, DateTime>> source2 = Enumerable.Where<\u0023\u003DqEF80Yvamo98ZmPyDgj9S83tqQZUTw9Y1GwDqtxtmj2w\u003D<\u0023\u003DqdDI3Y3B9NuGEyhuWEKOMQw\u003D\u003D, DateTime>>(source1, predicate);
if (\u0023\u003DqjscC_sD__Wz1R8OrZhlzyOI5tzzg7BToUBKXwTVqZO84NhphJRI0eyRNGeGaeg0l<\u0023\u003DqdDI3Y3B9NuGEyhuWEKOMQw\u003D\u003D, \u0023\u003DqAS4sOB3tWVQahGWJQZAVyQ\u003D\u003D, \u0023\u003DqBue7tPpoVUuUSzCh\u0024R8o6w\u003D\u003D>.\u0023\u003DqE9hVdSYL5I2ieTBjraxX5RotRNF07gEFMvwNoPwOkgsDM59ZsIUpRxIDaPISoXVU == null)
\u0023\u003DqjscC_sD__Wz1R8OrZhlzyOI5tzzg7BToUBKXwTVqZO84NhphJRI0eyRNGeGaeg0l<\u0023\u003DqdDI3Y3B9NuGEyhuWEKOMQw\u003D\u003D, \u0023\u003DqAS4sOB3tWVQahGWJQZAVyQ\u003D\u003D, \u0023\u003DqBue7tPpoVUuUSzCh\u0024R8o6w\u003D\u003D>.\u0023\u003DqE9hVdSYL5I2ieTBjraxX5RotRNF07gEFMvwNoPwOkgsDM59ZsIUpRxIDaPISoXVU = new Func<\u0023\u003DqEF80Yvamo98ZmPyDgj9S83tqQZUTw9Y1GwDqtxtmj2w\u003D<\u0023\u003DqdDI3Y3B9NuGEyhuWEKOMQw\u003D\u003D, DateTime>, \u0023\u003DqdDI3Y3B9NuGEyhuWEKOMQw\u003D\u003D>(\u0023\u003DqjscC_sD__Wz1R8OrZhlzyOI5tzzg7BToUBKXwTVqZO84NhphJRI0eyRNGeGaeg0l<\u0023\u003DqdDI3Y3B9NuGEyhuWEKOMQw\u003D\u003D, \u0023\u003DqAS4sOB3tWVQahGWJQZAVyQ\u003D\u003D, \u0023\u003DqBue7tPpoVUuUSzCh\u0024R8o6w\u003D\u003D>.\u0023\u003Dq7aL0H77QpSgfenltCnx_VQ\u003D\u003D);
Func<\u0023\u003DqEF80Yvamo98ZmPyDgj9S83tqQZUTw9Y1GwDqtxtmj2w\u003D<\u0023\u003DqdDI3Y3B9NuGEyhuWEKOMQw\u003D\u003D, DateTime>, \u0023\u003DqdDI3Y3B9NuGEyhuWEKOMQw\u003D\u003D> selector2 = \u0023\u003DqjscC_sD__Wz1R8OrZhlzyOI5tzzg7BToUBKXwTVqZO84NhphJRI0eyRNGeGaeg0l<\u0023\u003DqdDI3Y3B9NuGEyhuWEKOMQw\u003D\u003D, \u0023\u003DqAS4sOB3tWVQahGWJQZAVyQ\u003D\u003D, \u0023\u003DqBue7tPpoVUuUSzCh\u0024R8o6w\u003D\u003D>.\u0023\u003DqE9hVdSYL5I2ieTBjraxX5RotRNF07gEFMvwNoPwOkgsDM59ZsIUpRxIDaPISoXVU;
IEnumerable<\u0023\u003DqdDI3Y3B9NuGEyhuWEKOMQw\u003D\u003D> collection = Enumerable.Select<\u0023\u003DqEF80Yvamo98ZmPyDgj9S83tqQZUTw9Y1GwDqtxtmj2w\u003D<\u0023\u003DqdDI3Y3B9NuGEyhuWEKOMQw\u003D\u003D, DateTime>, \u0023\u003DqdDI3Y3B9NuGEyhuWEKOMQw\u003D\u003D>(source2, selector2);
list2.AddRange(collection);
}
return (IEnumerable<\u0023\u003DqdDI3Y3B9NuGEyhuWEKOMQw\u003D\u003D>) list1;
}
Видно, что несмотря на интерфейс IEnumerable, вывод производится не через yield return, а обычным списком в памяти. Т.е. возможные миллионы строк утрамбовываются в оперативную память.
Не очень хорошее поведение для высоконагруженной системы.
Данные всего за 2 недели по фьючерсу RI отъедают при этом памяти около 4Гб.