Показать полную графическую версию : Ускорение обработки
firstarey
13-04-2017, 08:22
Доброго времени суток!
Есть рабочий код.
#-->Заполнение 1 листа (координаты)
if ($DocVers -eq "09") {
$Row = $s1.Range("A65536").End(-4162).Row + 1
$oXmlDocument.KPT.CadastralBlocks.CadastralBlock.Parcels.Parcel |`
ForEach-Object -Process {
$CadNumUch = $_.CadastralNumber
$_.EntitySpatial.SpatialElement.SpelementUnit |`
ForEach-Object -Process {
# Заполняем
$s1.Cells.Item($Row,1) = $CadNumUch
$s1.Cells.Item($Row,2) = $($_.SuNmb)
$s1.Cells.Item($Row,3) = $($_.Ordinate.X -replace "\.",",")
$s1.Cells.Item($Row,4) = $($_.Ordinate.Y -replace "\.",",")
$s1.Cells.Item($Row,5) = $($_.Ordinate.DeltaGeopoint -replace "\.",",")
$Row++
}
}
}
из XML берутся сведения и заполняются в Excel. Но так как данных бывает много, то обработка длится весьма продолжительное время (бывает и 10 минут и 15 и 20)
Возможно ли как то ускорить процесс или хоть приделать прогресс-бар какой?
из XML берутся сведения и заполняются в Excel »
У нас одна из бухов тем же занимается. Было: "Запускаю расчёт с утра — хорошо если к концу рабочего дня закончит". Стало: "Запускаю расчёт, иду к девочкам попить чайку, возвращаюсь — а уже всё готово!".
Что было сделано:
1. Пятилетний компьютер был заменён на современный с процессором i5 — но только это такого прироста не дало бы.
2. В качестве винчестера установлен SSD. Поскольку операция связана со множественным чтением и записью файлов, в т.ч. временных — это дало основное ускорение.
firstarey
13-04-2017, 11:22
Пятилетний компьютер был заменён на современный »
не актуально.
1. компьютер с SSD, процессор AMD FX-8320E, памяти 8 гб.
2. файл обрабатывается 1, находиться на сервере (не на этом компьютере)
Вопрос именно в том как оптимизировать процесс чтения и записи в PS?
у меня сейчас код "читает xml-пишет xlsx" и так по кругу, а значений много.
Может, если сначала поймать все нужные значения и только потом их записать в ексель, будет прирост производительности ?
Возможно ли как то ускорить процесс »
Возможно.
1. Сделайте в начале окно приложения-сервера Automation (в данном случае — Excel) невидимым (по куску Вашего «рабочего кода» нельзя судить). Под конец обработки делаете его видимым (если нужно, конечно).
2. Вместо того, чтобы гонять сервер Automation в хвост и гриву, раз за разом тупо проходя по всей иерархии объектов вниз:
$s1.Cells.Item($Row,1) = $CadNumUch
$s1.Cells.Item($Row,2) = $($_.SuNmb)
$s1.Cells.Item($Row,3) = $($_.Ordinate.X -replace "\.",",")
$s1.Cells.Item($Row,4) = $($_.Ordinate.Y -replace "\.",",")
$s1.Cells.Item($Row,5) = $($_.Ordinate.DeltaGeopoint -replace "\.",",")
создайте один раз наиболее «глубокий» объект и обращайтесь к нему: где-то в начале, до всех циклов Вы создаёте $oCells = $s1.Cells, и далее используете его. Тоже самое с $_.Ordinate — только создаёте его внутри данного цикла. Экономятся, конечно, копейки, но это тот самый случай, когда копейки складываются в секунды, а иногда — в минуты и часы.
или хоть приделать прогресс-бар какой? »
Возможно. В PowerShell для этого есть специально предназначенные средства.
Может, если сначала поймать все нужные значения и только потом их записать в ексель, будет прирост производительности ? »
Смотреть надо. В принципе:
обработка длится весьма продолжительное время (бывает и 10 минут и 15 и 20) »
— это отнюдь не «весьма продолжительное время», тут овчинка выделки не стоит. Ну, разве что где-то явных ляпов не сделано в алгоритме. А так, конечно, можно и на чистый C (не C++) переползти.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.