У меня есть цикл из около 7000 объектов, и в цикле мне нужно получить отчетливое количество списков структур. В настоящее время я использую -Выберите Distinct Count очень медленно
foreach (var product in productsToSearch)
{
Console.WriteLine("Time elapsed: {0} start", stopwatch.Elapsed);
var cumulativeCount = 0;
productStore.Add(product);
var orderLinesList = totalOrderLines
.Where(myRows => productStore.Contains(myRows.Sku))
.Select(myRows => new OrderLineStruct
{
OrderId = myRows.OrderId,
Sku = myRows.Sku
});
var differences = totalOrderLines.Except(orderLinesList);
cumulativeCount = totalOrderLinsCount - differences.Select(x => x.OrderId).Distinct().Count();
cumulativeStoreTable.Rows.Add(product, cumulativeCount);
Console.WriteLine("Time elapsed: {0} end", stopwatch.Elapsed);
}
public struct OrderLineStruct
{
public string OrderId { get; set; }
public string Sku { get; set; }
}
Это очень медленно при получении отдельного счета. Кто-нибудь знает более эффективный способ сделать это? Я попытался использовать MoreLinq, у которого есть метод DisctintBy для Linq, но он не эффективнее, поскольку я его приурочил. Я играл с PLinq, но я немного не уверен, где распараллелить этот запрос.
Таким образом, каждая итерация цикла приурочен на -
Время истекло: 00: 00: 37,1142047 старт
Время истекло: 00: 00: 37.8310148 конец
= 0.7168101 сек * 7000 = 5017,6707 (83.627845 минут)
Его линия Distinct() Count(), которая занимает больше всего времени для обработки (около 0,5 секунды). Переменные различия имеют несколько сотен тысяч OrderLineStruct, поэтому любые запросы linq на этом медленны.
UPDATE
Я изменил цикл немного, и теперь он работает в около 10 минут, а что в течение 1 часа
foreach (var product in productsToSearch)
{
var cumulativeCount = 0;
productStore.Add(product);
var orderLinesList = totalOrderLines
.Join(productStore, myRows => myRows.Sku, p => p, (myRows, p) => myRows)
.Select(myRows => new OrderLineStruct
{
OrderId = myRows.OrderId,
Sku = myRows.Sku
});
totalOrderLines = totalOrderLines.Except(orderLinesList).ToList();
cumulativeCount = totalOrderLinesCount - totalOrderLines.Select(x => x.OrderId).Distinct().Count();
cumulativeStoreTable.Rows.Add(product, cumulativeCount);
}
Имея .ToList() на исключением, кажется, делает разница, и теперь я удаляю уже обработанные заказы после каждой итерации, что увеличивает производительность для каждой итерации.
Ну, что делает STRUCT выглядеть? [Mcve] действительно помог бы - у нас действительно нет большой информации о том, что происходит в данный момент. –
Сделайте его многопоточным. –
Зная, что такое структура или что означает «действительно медленный» (одна секунда? Десять секунд? Десять минут?) было бы здорово. –