2015-03-11 5 views
0

Корня
Проблемы я столкнулся проистекает из необходимости импорта данных из электронных таблиц. После того, как импорт был запущен, пользователь должен иметь возможность покинуть страницу и вернуться позже, когда импорт будет выполнен.
До сих пор параметры, о которых я знаю, - это запланированные задачи и фоновые работники в Орчард, которые, как я понимаю, запускаются раз в минуту с помощью развертки. (Пожалуйста, дай мне знать, если есть лучший вариант я проглядел)Orchard CMS: Создание ContentItems в цикле создает проблему задержки

Вопрос
Я в принципе создать новые элементы контента в цикле. И после того, как я столкнулся с некоторыми проблемами в течение некоторого времени, я установил очень простой тест с вызовом ajax, создающим X фиктивных элементов для каждого вызова и подсчета времени.
Я нахожу, что время, необходимое для создания элемента, немного увеличивается для каждой итерации. Если первый элемент может занять 20 мс, nr 200 в цикле займет 150 мс для создания. И, похоже, для этого нет крыши, она просто продолжает ухудшаться для каждой итерации.

В случае, если вы хотите увидеть тестовый код:

public TimeSpan CreateRandomItem(int nr) 
    { 
     Stopwatch sw = Stopwatch.StartNew(); 

     ContentItem item = _services.ContentManager.New("MyItemType"); 
     var myPart = item.As<MyPart>(); 
     myPart.Name = "Test nr " + nr; 
     _services.ContentManager.Create(item); 

     sw.Stop(); 
     return sw.Elapsed; 
    } 

    public JsonResult TestCreation(int amount, int nrReached) 
    { 
     StringBuilder sb = new StringBuilder(); 
     for (int i = nrReached + 1; i <= (nrReached + amount); i++) 
     { 
      TimeSpan elapsed = _associationImportService.CreateRandomAssociation(i); 
      sb.Append("\n - Nr " + i + " took " + elapsed.TotalMilliseconds + "ms"); 
     } 
     return Json(sb.ToString(), JsonRequestBehavior.AllowGet); 
    } 

После цикла завершения вызова Ajax запускает снова и теперь задержка резко снижается, начиная с более чем около 30 мс. Он не полностью восстанавливается в небольшом интервале между первым и вторым вызовами ajax, но это имеет огромное значение.

Я предполагаю, что это может быть связано с оставлением WorkContext, может быть? Но я не могу найти способ заставить это произойти, пока я остаюсь внутри цикла. Поскольку развертка работает только раз в минуту, я не могу придумать, как избежать этого цикла.

Вопрос
Есть ли что я могу сделать, чтобы избежать этой задержки накопления в то время как внутри цикла, или, возможно, другой подход к запуска импорта, что я упускать из виду? (Имейте в виду, что это должно выполняться в фоновом режиме, пока пользователя нет на странице) (Возможно, стоит упомянуть, что элемент, который я последний раз тестировал, не имеет индекса поиска от Lucene, но у него есть поля, которые я предполагаю необходимо добавить к индексированию поля. Если это имеет значение)

Спасибо.

+1

Взгляните на это: https://msdn.microsoft.com/en-us/library/ms182272%28v=vs.80%29.aspx –

+0

Справедливая точка. Тест производительности не должен содержать эту ошибку. Я обновил код для использования StringBuilder и снова запустил его с тем же результатом. –

ответ

2

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

шаги, которые мы предприняли, являются:

  • Перемещение импортирования на Orchard Command
    • Это означает, что вы находитесь за пределами рабочего процесса IIS и любые таймауты/блокировки, связанные с запуском вашего кода создания там
    • Это может быть не вариант для вас, если вам нужно сохранить свой процесс i n Пользовательский интерфейс Orchard.
  • Переместить работу в партии, а и после каждого пункта, или каждые х элементов внутри вашего звонка петли
    • _orchardServices.TransactionManager.RequireNew(), чтобы заставить сделку быть совершено
    • _orchardServices.ContentManager.Clear() очистить ссылки на любые предметы
    • содержания

Вам нужно впрыснуть в IOrchardServices для доступа к этим методам.

+0

Как вы упомянули, мне нужно сохранить импорт в пользовательском интерфейсе. Но я последовал твоему второму предложению, и это работает как шарм. Есть накладные расходы на вызов RequireNew и Clear, поэтому я вызываю их только каждые X итераций и сбрасывает задержку. Большое вам спасибо, ты спасатель, я построю храм в твоей чести! –

+0

Ничего себе, это имело огромное значение. Благодаря! – Xceno