Squeak.ru - шаблоны программирования

Как улучшить производительность linq с большими коллекциями (Code first POCO class)

Я хочу рассчитать оптимальное резервирование.

Когда я делаю это на PL/SQL, это очень медленно и дорого. Поэтому я пытаюсь использовать LINQ. У меня две коллекции, заказы и запасы. Но это тоже очень медленно. мне недостаточно быстро.

Я не могу использовать скомпилированный запрос. Я не могу использовать индекс Data Dictionary (я не работаю с уникальными данными). AsParallel() не сработало (по крайней мере, у меня).

Как улучшить производительность кода?

var orders = deserialize<Order>(@"C:\orders.bin");
  var stocks = deserialize<Stock>(@"C:\Stocks.bin");
for (int i = 0; i < 1000; i++)
{

  var order1 = (from p in orders
                where p.QTY_DEMAND > 0
                group p by new { p.OUTER_GROUP_ID, p.ORG_CODE, p.ARTICLE_CODE, p.FROM_ACCOUNTNO, p.AVAILABILITY_STATE } into g
                select new
                {
                    OUTER_GROUP_ID = g.Key.OUTER_GROUP_ID,
                    ORG_CODE = g.Key.ORG_CODE,
                    Article_code = g.Key.ARTICLE_CODE,
                    FROM_ACCOUNTNO = g.Key.FROM_ACCOUNTNO,
                    AVAILABILITY_STATE = g.Key.AVAILABILITY_STATE,
                    QUANTITY = g.Sum(p => p.QTY_DEMAND)
                });
  var order2 = from p in order1
                join vw1 in stocks on new { org_code = p.ORG_CODE, article_code = p.Article_code, account_no = p.FROM_ACCOUNTNO, av_state = p.AVAILABILITY_STATE }
                equals new { org_code = vw1.ORG_CODE, article_code = vw1.ARTICLE_CODE, account_no = vw1.ACCOUNTNO, av_state = vw1.AVAILABILITY_STATE }
                where vw1.QTY_STOCK > 0
                group new { p, o = vw1 } by new { baseValue, vw1.LOCATION_TYPE, vw1.PLACE_TYPE, p.Article_code, p.QUANTITY, vw1.STANDS_ON_THM } into g
                let SumQTY_STOCK = g.Sum(o => o.o.QTY_STOCK)
                select new
                {
                    BASE_VALUE = g.Key.baseValue,
                    g.Key.Article_code,
                    ...
                }
   var order3 = from p in order2
                group p by new { p.BASE_VALUE, p.LOCATION_TYPE, p.PLACE_TYPE } into g
                select new
                {
                    ...
                }
   var order4 = from a in order3
                ...
   foreach (var item in order4)
   {
       //doing somethings
   }
}

public List<T> deserialize<T>(string path)
        {
            using (var file = File.OpenRead(path))
            {
                BinaryFormatter ser = new BinaryFormatter();
                return (List<T>)ser.Deserialize(file);
            }
        }
02.02.2015

  • Проблема не в самом запросе, а в том, что вы выполняете его 1000 раз. 02.02.2015
  • Вы заявили, что пробовали LINQ и PL/SQL, и оба работают медленно. Я думаю, вы должны количественно определить, какое замедление для вашего случая и какую производительность вы хотели бы видеть. Кроме того, вам необходимо отметить, с каким объемом данных вы работаете, так как это изменит оптимальный ответ. И почему вы делаете это в цикле for (как заметил Серви) 02.02.2015
  • Мне приходится выступать много раз. потому что я хочу лучшее оптимальное бронирование. 02.02.2015
  • Профилируйте код. Затем расскажите нам, какие части на самом деле имеет смысл оптимизировать. 02.02.2015
  • @Ademsis - Можете ли вы опубликовать код для derserialize‹T›? 02.02.2015
  • Я отредактировал свой вопрос (для десериализации) 02.02.2015
  • @Ademsis каждый проход выводит результаты, отличные от предыдущего прохода? 02.02.2015
  • @Ademsis также, в заголовке написано «Code first POCO». Это POCO, но что вы имеете в виду под кодом в первую очередь? 02.02.2015

Ответы:


1

Для начинающих...

Переместите свои инициализаторы объекта из цикла. Вам не нужно загружать коллекции 1000 раз.

Изменять

for (int i = 0; i < 1000; i++)
{
   var orders = deserialize<Order>(@"C:\orders.bin");
   var stocks = deserialize<Stock>(@"C:\Stocks.bin");

to

var orders = deserialize<Order>(@"C:\orders.bin");
var stocks = deserialize<Stock>(@"C:\Stocks.bin");
for (int i = 0; i < 1000; ++i)
{
    ...

Я пришел к этому пониманию, потому что вы загружаете один и тот же файл на каждом проходе, что дорого. Вам нужно загрузить их только один раз каждый.

02.02.2015
  • Вы также сможете получить некоторый прирост производительности, используя Parallel.For, а не for, если вы работаете на › 1 процессоре. 02.02.2015
  • Если эти объекты откладывают выполнение (что вполне вероятно, если они возвращают IEnumerable или IQueryable), то это ничего не изменит. 02.02.2015
  • @Servy, мой ответ или комментарий Эрика? Вывод загрузки из цикла наверняка многое изменит. Если только deserialize‹T›().. не кэширует его внутренне и просто возвращает метод доступа при каждом повторном вызове, в чем я сомневаюсь. 02.02.2015
  • @Ryios Я имел в виду твой ответ. Вывод вызова из цикла ничего не даст, если его выполнение будет отложено. Он по-прежнему выполнял бы всю работу каждый раз, когда повторялся. 02.02.2015
  • спасибо, Риос, но мне жаль, что я написал это неправильно на форуме. Уже это. 02.02.2015
  • Я собираюсь попробовать parallel.For. 02.02.2015
  • Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...