2015-06-08 1 views
0

Скажем, в моем облаке есть 18 ядер, и каждое ядро ​​может выполнять 2 потока, что означает, что в целом я могу продолжить 36 потоков. Предположим, я создал 36 потоков. Я хочу создать 36 ARInvoices через график ARInvoiceEntry. Что лучше/быстрее: разделите ARINvoiceEntry график среди 36 потоков или создайте 36 графиков ARInvoiceEntry.Acumatica с потоками

+1

в каждом потоке, чтобы создать график ARInvoiceEntry отдельно или создать для каждого потока, отделенного графиком ARInvoiceEntry? В чем разница между этими двумя? извините, непонятно для меня. – Hybridzz

ответ

0

Наконец-то я нашел способ правильно ускорить вставку в Acumatica. Самая большая часть, о которой нужно помнить, заключается в том, что постоянство базы данных должно выполняться в одном потоке. Этого легко добиться при блокировке C#. Вот некоторые фрагменты моего рабочего раствора: блокировки объекта:

private Object thisLock = new Object(); 

Для каждого логического ядра я создал нить и разделения данных для каждого потока отдельно:

int numberOfLogicalCores = Environment.ProcessorCount; 
List<Thread> threads = new List<Thread>(numberOfLogicalCores); 

int sizeOfOneChunk = (customers.Count/numberOfLogicalCores) + 1; 

for (int i = 0; i < numberOfLogicalCores; i++) 
     { 
      int a = i; 
      var thr = new Thread(
       () => 
       { 
        var portions = customers.Skip(a * sizeOfOneChunk).Take(sizeOfOneChunk).ToList(); 
        InsertCustomersFromList(portionsCustomers); 
       } 
      ); 
      thr.Name = $"thr{i}"; 

      threads.Add(thr); 
     } 

foreach (var thread in threads) 
{ 
     thread.Start(); 
} 

foreach (var thread in threads) 
{ 
     thread.Join(); 
} 

, а затем часть, которая должна выполняться в одном потоке Я заблокировал его следующим образом:

lock (thisLock) 
{ 
     custMaint.Actions.PressSave(); // custMaint is the name of created graph 
} 

В моих тестах улучшение разницы в повышении было три раза. 110 записей были вставлены через 1 минуту по сравнению с тремя минутами в однопоточном режиме. А также ресурсы сервера использовались с большей эффективностью.

0

Экземпляр графа создается каждый раз, когда клиент отправляет данные на сервер и уничтожается после обработки запроса. Представления данных извлекают верхнюю запись данных на основе Order by. Поэтому для обработки вам нужно будет убедиться, что нужная запись извлекается в вашем представлении. Моим выбором было бы создать 36 графиков. Не стесняйтесь возражать ... это интересный вопрос.