Максимальне використання процесора


9

Мій сценарій - це пересічні лінії з багатокутниками. Це довгий процес, оскільки налічується понад 3000 ліній та понад 500000 полігонів. Я виконаний з PyScripter:

# Import
import arcpy
import time

# Set envvironment
arcpy.env.workspace = r"E:\DensityMaps\DensityMapsTest1.gdb"
arcpy.env.overwriteOutput = True

# Set timer
from datetime import datetime
startTime = datetime.now()

# Set local variables
inFeatures = [r"E:\DensityMaps\DensityMapsTest.gdb\Grid1km_Clip", "JanuaryLines2"]
outFeatures = "JanuaryLinesIntersect"
outType = "LINE"

# Make lines
arcpy.Intersect_analysis(inFeatures, outFeatures, "", "", outType)

#Print end time
print "Finished "+str(datetime.now() - startTime)


Моє запитання: чи є спосіб змусити ЦП працювати на 100%? Він працює на 25% весь час. Я думаю, що сценарій працював би швидше, якби процесор був на 100%. Неправильне відгадування?
Моя машина:

  • Windows Server 2012 R2 Standard
  • Процесор: процесор Intel Xeon E5-2630 0 @ 2.30 GHz 2.29 GHz
  • Встановлена ​​пам'ять: 31,6 ГБ
  • Тип системи: 64-бітна операційна система, процесор на основі x64


введіть тут опис зображення


Я б настійно запропонував перейти до багатониткового нарізу. Це не тривіально, але це більш ніж компенсує зусилля.
alok jha

1
Який просторовий індекс ви застосували до своїх полігонів?
Кірк Куйкендалл

1
Також ви пробували ту ж операцію з ArcGIS Pro? Це 64 біт і підтримує багатопотоковість. Я був би здивований, якщо це досить розумно, щоб розбити перетин на кілька потоків, але варто спробувати.
Кірк Куйкендалл

Клас функцій багатокутника має просторовий індекс з назвою FDO_Shape. Я не думав про це. Чи варто створити ще один? Хіба цього недостатньо?
Мануель Фріас

1
Оскільки у вас багато оперативної пам’яті… Ви спробували скопіювати багатокутники в клас пам'яті в пам'ять, а потім перетнути лінії з цим? Або якщо ви зберігаєте його на диску, ви спробували його ущільнити? Нібито ущільнення покращує введення / виведення.
Кірк Куйкендалл

Відповіді:


13

Дозвольте мені здогадатися: ваш процесор має 4 ядра, тому 25% використання процесора - це 100% використання одного ядра та 3 непрацюючих ядра.

Тож єдине рішення - зробити код багатопотоковим, але це не проста задача.


4
Процесор він згадує використовує 6 ядер і 12 потоків.
Керстен

5
Привіт, я не можу сказати, але мені б хотілося! На жаль, Python має GIL, на жаль, ви навіть не можете перечитати багатопотокові речі (найкраще, що ви можете зробити, це розблокувати GIL, коли нитка блокується на системному виклику)
Alec Teal

2
@AlecTeal ви, безумовно, можете, наприклад, з Jython або multiprocessingмодулем.
праворуч

@elyse йде "О так, ви можете повністю зробити це в Python, якщо під Python ви маєте на увазі Jython" не враховується. Мені доведеться розглянути багатопроцесорний процес, чи імпорт мав би змогу повторно реалізувати те, що робить Python Python?
Alec Teal

@AlecTeal Він породжує процеси (які є одним із способів зробити паралелізм). Дивіться документацію multiprocessingмодуля.
праворуч

13

Я не дуже впевнений, що це завдання, пов'язане з процесором. Я думаю, це буде операція, пов'язана з входом / виводом, тому я б хотів використати найшвидший диск, до якого я мав доступ.

Якщо E: це мережевий накопичувач, то усунення це було б першим кроком. Якщо це не високопродуктивний диск (<7 мс шукати), то це було б другим. Ви можете досягти певної вигоди від копіювання шару полігону в in_memoryробочу область, але вигода може залежати від розміру класу функцій полігону та від того, чи використовуєте ви 64-бітну обробку фону.

Оптимізація пропускної здатності вводу / виводу часто є важливою для продуктивності ГІС, тому я рекомендую вам приділяти менше уваги вимірювальному процесору та більше уваги мережевим та дисковим вимірювачам.


4

У мене були подібні проблеми щодо продуктивності щодо архівних скриптів, головне вузьке місце - це не процесор, це жорсткий диск, якщо ви використовуєте дані з мережі, що є найгіршим сценарієм, спробуйте перенести свої дані на SSD-диск, а потім запустіть свій скрипт з командного рядка не від pyscripter, pyscripter трохи повільніше, тому що він містить деякі налагоджувальні матеріали, якщо вас знову не влаштовує, подумайте про паралельне встановлення сценарію, тому що кожен потік python займає одне ядро ​​процесора, ваш процесор має 6 ядер, тому ви можете запустити 6 сценаріїв одночасно.


3

Оскільки ви використовуєте python і, як було запропоновано вище, розгляньте можливість використання багатопроцесорної обробки, якщо ваша проблема може працювати паралельно.

Я написав невелику статтю на веб-сайті geonet про перетворення сценарію python в інструмент сценарію python, який можна було б використати в модельєрі. Документ перераховує код і описує деякі підводні камені для його запуску як інструменту сценарію. Це лише одне місце, щоб почати шукати:

https://geonet.esri.com/docs/DOC-3824


Це, здається, шлях! Ваш сценарій працює добре, але я не знаю, як його змінити, щоб він працював з моїм сценарієм. Краще, я думав зробити Табличне перехрестя з багатокутниками та лініями. Будь-яка ідея?
Мануель Фріас

3

Як було сказано раніше, слід використовувати багатообробку або нарізування різьби . Але тут випливає застереження: Проблема повинна бути розділеною! Тому подивіться на https://en.wikipedia.org/wiki/Divide_and_conquer_algorithms .

Якщо ваша проблема ділиться, ви б походили так:

  • Створіть чергу, де ви зберігаєте вхідні дані для процесів / потоку
  • Створіть чергу, де зберігаються результати
  • Створіть функцію або клас, який можна використовувати як процес / потік, який вирішує нашу проблему

Але, як сказав Geogeek, це може бути не проблема обмеження процесора, а проблема IO. Якщо у вас є достатня кількість оперативної пам’яті, ви можете попередньо завантажити всі дані, а потім обробити їх, що має перевагу в тому, що дані можна прочитати за один раз, таким чином, не завжди перериває процес обчислення.


3

Я вирішив перевірити його, використовуючи 21513 ліній та 498596 багатокутників. Я протестував багатопроцесорний підхід (12 процесорів на моїй машині) за допомогою цього сценарію:

import arcpy,os
import multiprocessing
import time
t0 = time.time()
arcpy.env.overwriteOutput = True
nProcessors=4
folder=r'd:\scratch'

def function(inputs):
        nGroup=inputs[0]
        pGons=inputs[1]
        lines=inputs[2]
        outFeatures = '%s%s%s_%i.shp' %(folder,os.sep,'inters',nGroup)
        fids= tuple([i for i in range(nGroup,500000,nProcessors-1)])
        lyr='layer%s'%nGroup
        query='"FID" in %s' %str(fids)
        arcpy.MakeFeatureLayer_management(pGons,lyr,query)
        arcpy.Intersect_analysis([lines,lyr], outFeatures)
        return outFeatures
if __name__ == "__main__":
        inPgons='%s%s%s' %(folder,os.sep,'parcels.shp')
        inLines='%s%s%s' %(folder,os.sep,'roads.shp')
        m,bList=0,[]
        for i in range(nProcessors):
                bList.append([i,inPgons,inLines])
        pool = multiprocessing.Pool(nProcessors-1)
        listik=pool.map(function, bList)
##      apply merge here
        print listik
        print ('%i seconds' %(time.time()-t0))

Результати, секунди:

  • нормальний локальний жорсткий диск - 191
  • надшвидкий місцевий привід - 220
  • мережевий диск - 252

Найцікавіше, що це зайняло лише 87 секунд, використовуючи інструмент геообробки від mxd. Можливо, щось не так у моєму підході до басейну ...

Як видно, я використав досить некрасивий FID-запит у (0, 4, 8,12… 500000), щоб зробити завдання поділеним.

Можливо, що запит на основі попередньо обчисленого поля, наприклад CFIELD = 0, значно скоротить час.

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


1
Так, ви використовуєте список, який додається до проблем із блокуванням. Спробуйте мультипроцесорну чергу. Також намагайтеся не виписувати матеріали в робочих процесах, але створіть чергу вихідних даних з даними, які ви хочете записати, і нехай це буде виконано автором процесу.
Бенджамін

3

Я не знайомий з PyScripter, але якщо він підтримується CPython, то вам слід перейти до багатопроцесорної роботи, а не до багатопотокової, доки сама проблема не поділяється (як це вже згадували інші).

CPython має Global Interpreter Lock , який скасовує будь-які переваги, які у вашому випадку можуть принести кілька потоків .

Напевно в інших контекстах потоки python корисні, але не у випадках, коли ви пов'язані з процесором.


1

Моє запитання: чи є спосіб змусити ЦП працювати на 100%

Оскільки у вашого процесора є декілька ядер, ви лише збільшите максимальну ядро, на якому працює ваш процес. Залежно від налаштування вашого чіпа Xeon, він буде працювати до 12 ядер (6 фізичних та 6 віртуальних з увімкненою гіпертетизацією). Навіть 64-бітний ArcGIS насправді не в змозі скористатися цим - і це може призвести до обмеження процесора, коли ваш єдиний потоковий процес максимізує основну функцію. Вам потрібна багатопотокова програма для розподілу навантаження по ядрах АБО (набагато простіше) ви можете зменшити кількість ядер, на яких працює ваш процесор, щоб збільшити пропускну здатність.

Найпростіший спосіб зупинити обмеження процесора (і переконатися, що це дійсно обмеження процесора, а не обмеження на диск / введення) - це змінити параметри BIOS для вашого Xeon і встановити його на одне масивне єдине ядро. Підвищення продуктивності буде значним. Просто пам’ятайте, що це також значно торгує вашими ПК багатоцільовими можливостями, тому найкраще, якщо у вас є спеціальна технологічна машина для її здійснення. Це набагато простіше, ніж намагатися вкласти багатопотоковий код - який більшість функцій ArcGIS Desktop (як на 10.3.1) так чи інакше не підтримує.


Який параметр слід шукати, щоб перетворити ваш процесор на "одне масивне єдине ядро"?
Алекс Маквітті

1
Точне меню буде залежати від вашої мікропрограми BIOS та мікросхем, але зазвичай воно буде в меню BIOS Setup> Advanced> CPU Configuration. Ви хочете вимкнути гіперрезьбу, а потім встановити кількість ядер для активації. 0 зазвичай є всім - встановіть значення 1, якщо потрібно одне велике ядро. Гарна ідея взяти до відома налаштування перед тим, як змінити речі - звучить очевидно, але легко не помітити, якщо речі не виходять.
kingmi
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.