Высокая загрузка ЦП при создании файла CSV из представления SQL Server с использованием C # и Powershell - PullRequest
0 голосов
/ 05 октября 2018

Я создаю файл CSV из представления SQL Server с помощью Powershell, чтобы пользователи могли загрузить его с нашего веб-сайта ASP Web Forms:

Сценарий Powershell:

Push-Location $PWD;Import-Module -Name SQLPS;Invoke-Sqlcmd -Query 'SELECT 1' ` -Database  *** `  -username '***' -password '***' -Server localhost |Out-Null;Pop-Location;Invoke-Sqlcmd -Query 'query here' ` -Database *** ` -username '***' -password '***' -Server ***| Export-Csv -NoTypeInformation ` -Path 'C:\****\products.csv' ` -Encoding UTF8;

Код C #:

using (PowerShell PowerShellInstance = PowerShell.Create())
 {
    PowerShellInstance.AddScript(powerShellScript);                    
    Collection<PSObject> PSOutput = PowerShellInstance.Invoke();
 } 

В представлении 71784 строки, размер файла CSV составляет 12 МБ.Это занимает около 15 секунд, а загрузка ЦП увеличивается на 40% при генерации файлов с сайта веб-форм.

Когда тот же сценарий запускается непосредственно из консоли Powershell, кажется, что виновником на самом деле является Powershell: enter image description here

Очевидно, что он не подходит для производства.У нас есть сотни пользователей, которым потребуется сгенерировать этот файл с некоторыми конкретными параметрами для каждого пользователя (я не могу обслуживать один и тот же файл).

Пока я пытался:

Thread thread1 = new Thread(builder.GenerateCsvFile); 
thread1.Priority = System.Threading.ThreadPriority.Lowest;
thread1.Start(); 

IЯ не уверен, что использование Thread - это хорошая идея, во всяком случае, использование CPU примерно одинаково при использовании Thread.Любой совет, как уменьшить использование процессора с кодом C #?ИЛИ какой-либо другой подход с низким использованием ресурсов к этому?

1 Ответ

0 голосов
/ 05 октября 2018

Как уже упоминалось в комментариях, вам лучше всего запрашивать базу данных и генерировать CSV в своем коде C # вместо сценария Powershell.Каждый раз, когда вы вызываете скрипт, возникают некоторые накладные расходы, поскольку на вашем веб-сервере запускается новый процесс powershell.Если у вас есть сотни вызовов, это быстро вызовет замедление и увеличит нагрузку на память, даже если вы оптимизировали сценарий PS.Пример того, как это сделать, в C #: здесь .

Если вы действительно хотите продолжать использовать решение Powershell, я бы посмотрел на использование модуля SqlServer вместо * 1006.*.Согласно Microsoft , модуль SQLPS больше не обновляется, и вы можете получить более высокую производительность, используя версию Invoke-SqlCmd SqlServer.Несмотря на это, когда я тестировал ваш PowerShell, и Invoke-SQLCmd, и Export-Csv вызывали одинаковый скачок загрузки ЦП на моем ПК с использованием моих данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...