CPU kullanımını en üst düzeye çıkarma


9

Benim senaryom çokgenler ile kesişen çizgiler var. 3000'den fazla çizgi ve 500000'den fazla çokgen olduğu için uzun bir süreç. PyScripter'dan yürüttüm:

# 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)


Benim sorum: CPU'nun% 100 çalışmasını sağlamanın bir yolu var mı? Her zaman% 25 çalışıyor. İşlemci% 100 olsaydı betiğin daha hızlı çalışacağını tahmin ediyorum. Yanlış tahmin?
Makinem:

  • Windows Server 2012 R2 Standardı
  • İşlemci: Intel Xeon CPU E5-2630 0 @ 2.30 GHz 2.29 GHz
  • Kurulu bellek: 31,6 GB
  • Sistem türü: 64 bit İşletim Sistemi, x64 tabanlı işlemci


resim açıklamasını buraya girin


Çok iş parçacığına gitmeyi şiddetle öneririm. Bu, kurulumu önemsiz değildir, ancak çabaları telafi etmekten daha fazlası olacaktır.
Aloha Jha

1
Çokgenlerinize ne tür bir uzamsal indeks uyguladınız?
Kirk Kuykendall

1
Ayrıca ArcGIS Pro ile aynı işlemi denediniz mi? 64 bit ve çoklu iş parçacığı desteği. Bir Kesişim'i birden çok iş parçacığına ayıracak kadar akıllıysa şaşırırdım, ama denemeye değer.
Kirk Kuykendall

Çokgen özellik sınıfı, FDO_Shape adında bir uzamsal dizine sahiptir. Bunu düşünmedim. Başka bir tane oluşturmalı mıyım? Bu yeterli değil mi?
Manuel Frias

1
Çok fazla RAM'iniz olduğundan ... çokgenleri bir bellek içi özellik sınıfına kopyalamayı denediniz ve ardından bununla satırları kesiştiniz mi? Yoksa diskte tutuyorsanız sıkıştırmayı denediniz mi? Sözde sıkıştırma, G / Ç'yi iyileştirir.
Kirk Kuykendall

Yanıtlar:


13

Tahmin edeyim: İşlemcinizde 4 çekirdek var, bu nedenle% 25 işlemci kullanımı, bir çekirdeğin% 100 kullanımı ve 3 boş çekirdek.

Bu yüzden tek çözüm kodu çok iş parçacıklı yapmaktır, ancak bu basit bir görev değildir.


4
O söz işlemci 6 çekirdek ve 12 konuları kullanmaktadır.
Kersten

5
Merhaba, aşağıya inemem ama istiyorum! Python'un maalesef bir GIL'si var, bu yüzden hiç bir şeyi çok yönlü okuyamıyorsunuz (yapabileceğiniz en iyi şey, bir sistemde bir iş parçacığı bloke olduğunda GIL'in kilidinin açılmasıdır)
Alec Teal

2
@AlecTeal, örneğin Jython veya multiprocessingmodül ile kesinlikle yapabilirsiniz .
sağ kanat

@elyse "Oh evet, Python'da bunu tamamen yapabilirsiniz, eğer Python ile Jython demek istersen" sayılmaz. Çok işlemciliğe bakmalıydım, bir ithalat Python Python'u yapan şeyi yeniden uygulama gücüne sahip mi?
Alec Teal

@AlecTeal (Paralellik yapmanın bir yolu olan) süreçleri ortaya çıkarır. multiprocessingModülün belgelerine bakın .
sağa doğru

13

Bunun CPU'ya bağlı bir görev olduğundan emin değilim. I / O-bağlı bir işlem olacağını düşünürdüm, bu yüzden erişebildiğim en hızlı diski kullanmak isterdim.

E: bir ağ sürücüsü ise, bunu ortadan kaldırmak ilk adım olacaktır. Yüksek performanslı bir disk değilse (<7 ms), bu ikinci olur. Çokgen katmanını bir in_memoryçalışma alanına kopyalamaktan fayda sağlayabilirsiniz, ancak yarar çokgen özellik sınıfının boyutuna ve 64 bit arka plan işleme kullanıp kullanmadığınıza bağlı olabilir.

G / Ç verimini optimize etmek genellikle GIS performansının anahtarıdır, bu yüzden CPU sayacına daha az dikkat etmenizi ve ağ ve disk sayaçlarına daha fazla dikkat etmenizi öneririm.


4

Arcpy betikleriyle ilgili benzer performans sorunları yaşadım, en büyük darboğaz sabit disk CPU'su değil, en kötü senaryo olan ağdan veri kullanıyorsanız, verilerinizi SSD sürücüsüne taşımayı deneyin, ardından komut dosyanızı komut satırından başlatın pyscripter'dan değil, pyscripter biraz daha yavaş olabilir, çünkü bazı hata ayıklama öğeleri içerdiğinden, tekrar memnun değilseniz, senaryonuza paralellik yapmayı düşünün, çünkü her python iş parçacığı bir CPU çekirdeği alır, CPU'nuz 6 çekirdeğe sahiptir, böylece başlatabilirsiniz Aynı anda 6 komut dosyası.


3

Python kullanırken ve yukarıda önerildiği gibi, sorununuz paralel olarak çalıştırılabiliyorsa çoklu işlem kullanmayı düşünün.

Geonet web sitesinde, bir python betiğini model oluşturucu içinde kullanılabilecek bir python betiği aracına dönüştürme hakkında küçük bir makale yazdım. Belge kodu listeler ve bir komut dosyası aracı olarak çalıştırmak için bazı tuzakları açıklar. Bu, aramaya başlamak için sadece bir yer:

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


Bu yol gibi görünüyor! Betiğiniz iyi çalışıyor ancak betiğimle çalışmasını sağlamak için nasıl değiştirileceğini bilmiyorum. Daha da iyisi, çokgenler ve çizgilerle Tabulate Kesişim yapmayı düşünüyordum. Herhangi bir fikir?
Manuel Frias

3

Daha önce de belirtildiği gibi, çok işlemli veya diş çekme kullanmalısınız . Ama işte uyarı geliyor: Sorun bölünebilir olmalı! Https://en.wikipedia.org/wiki/Divide_and_conquer_algorithms adresine bir göz atın .

Sorununuz bölünebiliyorsa şöyle devam edersiniz:

  • İşlemler / iş parçacığı için giriş verilerini depoladığınız bir kuyruk oluşturma
  • Sonuçların depolandığı bir kuyruk oluşturun
  • Sorunumuzu çözen bir işlem / iş parçacığı olarak kullanılabilecek bir işlev veya sınıf oluşturun

Ancak geogeek'in söylediği gibi, bir CPU sınırlama sorunu değil, bir IO sorunu olabilir. Yeterli RAM'iniz varsa, tüm verileri önceden yükleyebilir ve daha sonra işleyebilirsiniz, bu da verilerin bir seferde okunabilmesi avantajına sahiptir, böylece hesaplama işlemini her zaman kesintiye uğratmaz.


3

21513 çizgi ve 498596 çokgen kullanarak test etmeye karar verdim. Bu komut dosyasını kullanarak çok işlemcili yaklaşımı (makinemdeki 12 işlemci) test ettim:

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))

Sonuçlar, saniye:

  • normal yerel sabit disk - 191
  • süper hızlı yerel sürücü - 220
  • ağ sürücüsü - 252

Komik şey mxd coğrafi işleme aracı kullanarak sadece 87 saniye sürdü. Belki de havuza yaklaşmamla ilgili yanlış bir şey ...

Görüldüğü gibi görevi bölünebilir yapmak için (0, 4, 8,12… 500000) yerine oldukça çirkin sorgu FID kullandım.

Önceden hesaplanmış alana, örneğin CFIELD = 0'a dayalı sorgunun zamanı büyük ölçüde azaltacağı mümkündür.

Ayrıca, çok işlemli araçlar tarafından bildirilen zamanın çok farklı olabileceğini buldum.


1
Evet, kilitleme sorunları ile birlikte gelen bir liste kullanıyorsunuz. Bir çoklu işleme deneyin. Sırayla. Ayrıca, çalışan işlemlerinde bir şeyler yazmamaya çalışın, ancak yazmak istediğiniz verilerle bir çıkış kuyruğu oluşturun ve bunun bir yazar işlemi tarafından yapılmasına izin verin.
Benjamin

3

PyScripter'e aşina değilim, ancak CPython tarafından destekleniyorsa, problemin kendisi bölünebilir olduğu sürece (diğerleri zaten bahsettiği gibi) çoklu işleme ve çoklu iş parçacığına gitmemelisiniz.

CPython, sizin durumunuzda birden çok iş parçacığının getirebileceği faydaları iptal eden bir Global Tercüman Kilidine sahiptir .

Diğer bağlamlarda python iş parçacıkları yararlıdır, ancak CPU'ya bağlı olduğunuz durumlarda değil.


1

Benim sorum: CPU'nun% 100 çalışmasını sağlamanın bir yolu var mı?

CPU'nuzun birden fazla çekirdeği olduğundan, yalnızca işleminizin çalıştığı çekirdeği maksimize edersiniz. Xeon çipinizi nasıl yapılandırdığınıza bağlı olarak, 12 çekirdeğe kadar çalışacaktır (6 fiziksel ve 6 sanal hiper iş parçacığı açık). 64bit ArcGIS bile bundan gerçekten yararlanamaz - ve bu, tek iş parçacıklı işleminiz çalıştığı çekirdeği en üst düzeye çıkardığında CPU sınırlamalarına neden olabilir. Yükü çekirdeklere yaymak için çok iş parçacıklı bir uygulamaya ihtiyacınız var VEYA (çok daha basit) verimi artırmak için CPU'nuzun çalıştığı çekirdek sayısını azaltabilirsiniz.

CPU sınırlamasını durdurmanın en kolay yolu (ve disk i / o kısıtlamaları değil, gerçekten CPU sınırlaması olduğundan emin olun) Xeon'unuz için BIOS ayarlarını değiştirmek ve tek bir büyük çekirdeğe ayarlamaktır. Performans artışı önemli olacaktır. Sadece bu da PC'lerin çok görev yeteneği oldukça esnaf esnaf unutmayın bu yüzden bunu uygulamak için özel işlem makinesi varsa en iyisidir. Çoğu ArcGIS Desktop işlevinin (10.3.1'deki gibi) zaten desteklemediği, kodunuzu çoklu işlemeye çalışmaktan çok daha basittir.


CPU'nuzu "tek bir büyük çekirdeğe" dönüştürmek için hangi ayarı aramanız gerekir?
Alex McVittie

1
Tam menü BIOS'unuza ve yonga ürün yazılımınıza bağlı olacaktır, ancak genellikle BIOS Menü Kurulumu> Gelişmiş> CPU Yapılandırması'nda olacaktır. Hiper iş parçacığını kapatmak ve ardından etkinleştirilecek çekirdek sayısını ayarlamak isteyeceksiniz. 0 genellikle hepsi - büyük bir çekirdek istiyorsanız 1 olarak ayarlanır. Bir şeyleri değiştirmeden önce ayarları not etmek iyi bir fikirdir - işler işe yaramazsa, net ama göz ardı edilmesi kolay sesler.
kingmi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.