Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Ускорение обработки (http://forum.oszone.net/showthread.php?t=325900)

firstarey 13-04-2017 08:22 2728863

Ускорение обработки
 
Доброго времени суток!

Есть рабочий код.
кусок
Код:

                                                               
#-->Заполнение 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)

Возможно ли как то ускорить процесс или хоть приделать прогресс-бар какой?

mwz 13-04-2017 10:17 2728888

Цитата:

Цитата firstarey
из XML берутся сведения и заполняются в Excel »

У нас одна из бухов тем же занимается. Было: "Запускаю расчёт с утра — хорошо если к концу рабочего дня закончит". Стало: "Запускаю расчёт, иду к девочкам попить чайку, возвращаюсь — а уже всё готово!".

Что было сделано:
1. Пятилетний компьютер был заменён на современный с процессором i5 — но только это такого прироста не дало бы.
2. В качестве винчестера установлен SSD. Поскольку операция связана со множественным чтением и записью файлов, в т.ч. временных — это дало основное ускорение.

firstarey 13-04-2017 11:22 2728912

Цитата:

Цитата mwz
Пятилетний компьютер был заменён на современный »

не актуально.
1. компьютер с SSD, процессор AMD FX-8320E, памяти 8 гб.
2. файл обрабатывается 1, находиться на сервере (не на этом компьютере)

Вопрос именно в том как оптимизировать процесс чтения и записи в PS?
у меня сейчас код "читает xml-пишет xlsx" и так по кругу, а значений много.
Может, если сначала поймать все нужные значения и только потом их записать в ексель, будет прирост производительности ?

Iska 13-04-2017 12:43 2728927

Цитата:

Цитата firstarey
Возможно ли как то ускорить процесс »

Возможно.

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 — только создаёте его внутри данного цикла. Экономятся, конечно, копейки, но это тот самый случай, когда копейки складываются в секунды, а иногда — в минуты и часы.

Цитата:

Цитата firstarey
или хоть приделать прогресс-бар какой? »

Возможно. В PowerShell для этого есть специально предназначенные средства.

Цитата:

Цитата firstarey
Может, если сначала поймать все нужные значения и только потом их записать в ексель, будет прирост производительности ? »

Смотреть надо. В принципе:
Цитата:

Цитата firstarey
обработка длится весьма продолжительное время (бывает и 10 минут и 15 и 20) »

— это отнюдь не «весьма продолжительное время», тут овчинка выделки не стоит. Ну, разве что где-то явных ляпов не сделано в алгоритме. А так, конечно, можно и на чистый C (не C++) переползти.


Время: 14:34.

Время: 14:34.
© OSzone.net 2001-